c-将无符号的long传递给使用long的函数是否不安全



前言:我不允许使用C库中的任何函数

我有这个功能:

char *to_base(long nbr, char *base)
{
static char buffer[50];
char    *ptr;
int     base_len;
ptr = &buffer[49];
*ptr = 0;
base_len = ft_strlen(base);
while (nbr != 0)
{
*--ptr = base[nbr % base_len];
nbr /= base_len;
}
return (ptr);
}

正如我们所看到的,这需要很长时间。在我的程序中,我有一个无符号长,我必须将其转换为十六进制值。在该函数中传递无符号长是否不安全?如果是,我该如何使其工作?

编辑:以下是我目前使用它的方式:

unsigned long    val;
char            *hexa;
val = (unsigned long)va_arg(*list, void *);
hexa = to_base(val, "0123456789abcdef");

在这个函数中传递无符号的long是否不安全?

它是"安全";,因为在程序中不会格式化你的硬盘或发动另一场世界大战。

传递的函数参数被转换为参数类型。无符号值将被转换为有符号值。现在所有的体系结构都使用twos补码,很容易预测结果。编译器应该记录行为,例如在gcc实现中定义的beahvior:

将整数转换为带符号整数类型(C90 6.2.1.2、C99和C11 6.3.1.3(的结果或由其引发的信号。

对于转换为宽度为N的类型,该值以2^N为模减少到该类型的范围内;则不产生任何信号。

"降模2^N"-基本上减去2^N,直到该值在范围内。如果你有32位的long(long)(unsigned long)4294967196ul,那么你从值中减去2^32,它等于(long)-100

如果是,我如何使其工作?

正确处理负数。

并为无符号数字和有符号数字分别编写一个函数。

此外,(unsigned long)va_arg(*list, void *);正在将void*指针值强制转换为unsigned long(?(。很可能您希望va_arg(list, unsigned long)-从参数中获取unsigned long

最新更新