这是" C ++编程的完整指南"中的一个例子。 (Ulla Kirch-Prinz& Peter Prinz)
示例:
cout << dec << -1 << " " << hex << -1;
此语句在32位系统上导致以下输出:
-1 ffffffff
有人可以解释为什么第二个输出是ffffffff
?
我在书中解释说:
当输出八进制或十六进制数时,该数字的位 要输出总是被解释为无符号!换句话说, 输出显示八进制或十六进制数字的位模式 格式。
答案 0 :(得分:5)
这是因为大多数现代机器都使用two's complement有符号整数表示。
在二进制补码中,最高位用作符号位。如果设置了,则该数字被认为是负数,要获得其绝对(正)值,您需要从2 N 中减去它,即取两个补码。
如果您有一个8位数字00000001,它的二进制补码将是100000000-00000001 = 11111111(或0xFF十六进制)。所以-1表示为二进制形式的全1。
这是一个非常方便的系统,因为你可以执行算术,好像数字是无符号的(让它们溢出),然后简单地将结果解释为有符号,并且它是正确的。
答案 1 :(得分:0)
编译器以下列方式为签名变量实现负数,如果最高位为真,则数字实现为(VALUE_RANGE - variable)
这是一个关于8位数的例子,我希望你能扩展它。
char 0 1 2 ... 10 ... 126 127 -128 -127 -126 ... -10 ... -2 -1
uchar 0 1 2 ... 10 ... 126 127 128 129 130 ... 246 ... 254 255
hex 0 1 2 ... A ... 7E 7F 80 81 82 ... F6 ... FE FF
答案 2 :(得分:0)
您突出显示的文字是输出相当于
cout << dec << -1 << " " << hex << (unsigned)-1;
在2的补码系统(现在是任何台式PC)中,-1
的位模式将所有位都设置为1.
因此,对于32位int
,输出将为ffffffff
。
最后请注意,如果int
(因此unsigned
)为32位,则文字0xffffffff
的类型为unsigned
。
参考文献: