为何printf输出fffffff5而非-11?八进制输出异常解惑
问题:printf使用%x/%o输出-11为何得到非预期结果?
使用printf的%x格式符输出-11时,结果为fffffff5而非预期的-11;使用%o格式符输出-11时,结果为37777777765,相关代码及输出如下:
代码1(%x格式符)
#include<stdio.h> int main() { printf("%x",-11); return 0; }
输出:
fffffff5
代码2(%o格式符)
#include<stdio.h> int main() { printf("%o",-11); return 0; }
输出:
37777777765
原因解析
格式符的类型匹配问题:
%x是用于输出无符号十六进制整数的格式符,%o是用于输出无符号八进制整数的格式符,它们都期望接收无符号整数类型的参数。但你传入的是有符号负数-11,此时printf会将这个有符号数按照无符号数的规则解析。补码存储的影响:在C语言中,有符号整数是以补码形式存储在内存中的。以32位
int类型为例:- 11的二进制为:
00000000 00000000 00000000 00001011 - 对其取反得到反码:
11111111 11111111 11111111 11110100 - 反码加1得到-11的补码:
11111111 11111111 11111111 11110101
- 11的二进制为:
格式符解析补码:
- 用
%x解析该补码时,会将其当作无符号十六进制数转换,结果就是fffffff5。 - 用
%o解析时,将补码按三位一组拆分转换为八进制,结果就是37777777765。
- 用
如果想要输出带符号的数值,应该使用%d格式符;若要以十六进制/八进制形式显示负数的符号,需要手动处理(比如先判断符号,再输出负号加绝对值的进制转换结果)。
内容的提问来源于stack exchange,提问作者Archit sharma
相关产品推荐
相关产品推荐

