代码:
char temp[] = "1010000001010011";
printf("%s\n", temp);
unsigned long num = atoi(temp);
printf("%lu\n", num);
输出:
1010000001010011
4081617243
为什么 num 不是 41043?
代码:
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
,尽管编译器生成的代码确实分配了该位模式,而这unsigned long
恰好是4081617243
.
非常感谢@AnT和@chux
Beacouseatoi()
将字符串转换为整数,而不是从二进制转换。例如代码
char str[]="123";
printf("%d",atoi(str));
将 123 打印为整数