为什么这段代码会输出一个负数?

6
我原本期望这段代码会输出一个非常大的数字以及比该数字小1的数,但实际上它只输出了-1和-2,这是为什么呢?
fprintf(stderr, "%d\n", 0xffffffff);
fprintf(stderr, "%d\n", 0xfffffffe);
4个回答

30

%d格式是有符号整数(十进制)格式。整数使用二进制补码进行存储,这意味着最高位(8000 0000)在某种程度上表示值的符号。

从3开始倒数,值为:

0000 0003 = 3
0000 0002 = 2
0000 0001 = 1
0000 0000 = 0
FFFF FFFF = -1
FFFF FFFE = -2

如果你希望将 FFFF FFFF 显示为一个大的正数,可以使用 %u (无符号) 格式。


哦,long类型的百分号是多少?还是unsigned类型的? - user105033
%u - 刚刚添加到响应中 :) - Bob Kaufman
3
int 是 %d,unsigned 是 %u,long int 是 %ld,long unsigned 是 %lu。 - Graeme Perrow
2
不是,%d 表示有符号十进制数,%u 则表示无符号十进制数。 - pavium
百分号%表示“某物”将会被放置在那里。例如,%.02f是合法的,将打印一个带有小数点后2位数字的浮点数,如果没有小数点后的数字,将打印2个0。 - Goz
C标准并没有规定整数必须使用二进制补码表示。具体使用三种可能的表示之一由编译器实现决定。符合标准的编译器可以使用“符号和大小”表示法,这种情况下可能存在一个值为“负零”的可能性,而这在二进制补码表示中是不可能的。 - P.P

8

参数 "%d" 会将输入打印为有符号整数。因此,你已经发现了 二进制补码表示法,请考虑使用 "%u"。


4
你提到的值是-1和-2的二进制补码表示法。
请查阅 二进制补码

3

有符号整数的第一位是表示符号的,因此可以存储的最大数字是0xEFFFFFFF。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接