[英]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.