【发布时间】:2021-11-25 17:35:33
【问题描述】:
我有这段代码可以将字符串转换为 int
unsigned int formatInt(char *ptr) {
int res;
if (sscanf(ptr, "%i", &res) == -1) exit(-1);
return res;
}
我给它一个char * 指向“00000000041”的第一个字符。
转换为 int 返回 33(隐式八进制到十进制转换)
“00000000041”实际上是一个字符串(char[12]),但它是八进制文件的大小。
编译器怎么知道它是八进制的? 00000000041 完全可以是小数 (41)
【问题讨论】:
-
scanf不“转换为十进制”,但它可以从十进制转换。当您使用%i时,它会从前导0检测八进制,但在您使用%d时不会检测到。 -
@WeatherVane 为什么前面的 0 表示八进制?它可能完全意味着十进制。 041 可能是 41。对不起,我没有得到“从十进制转换”。在这里,我给它一个它检测到的“八进制”,然后 %i 返回一个小数。所以从技术上讲,它从八进制到十进制正确吗?
-
根据定义。它不是“十进制”而是二进制。数字以十进制形式存储在字符串或 BCD 表示法中。
-
"%i"表示“如果有前导零,则将其视为八进制”。 -
@Eljay haha 我认为 %i 的意思是匹配一个 int。谢谢大家