繁体   English   中英

C中的unsigned long和atoi

[英]unsigned long and atoi in C

码:

char temp[] = "1010000001010011";
printf("%s\n", temp);
unsigned long num = atoi(temp);
printf("%lu\n", num);

输出:

1010000001010011
4081617243

为什么num不是41043?

atoi("1010000001010011"); 尝试将文本作为十进制字符序列转换为int 如果int足够宽,它将采用十进制值1,010,000,001,010,011。 毫不奇怪,该值超出了OP的int范围,因此结果是未定义的行为或UB。

若要将字符串转换为二进制字符,请使用strtol()strtoul()

char temp[] = "1010000001010011";
char *endptr;
int base = 2;
unsigned long ulnum = strtoul(temp, &endptr, base);
if (endptr == temp) puts("No conversion");
else printf("%lu\n", ulnum);  // 41043

atoi返回一个int值。 十进制数1010000001010011 (十六进制39696F348895B不适合32位变量,并被截断为十六进制F348895B即带符号十进制值-213350053 但是,尽管该编译器生成的代码确实分配了该位模式,但unsigned long碰巧是4081617243 ,但是将该值分配给unsigned long是不确定的行为。

非常感谢@AnT和@chux

Beacouse atoi()将字符串转换为整数,而不是从二进制转换。 例如代码

char str[]="123";
printf("%d",atoi(str));

将输出123为整数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM