在C ++中输出十六进制

时间:2018-05-25 07:10:14

标签: c++

这是" C ++编程的完整指南"中的一个例子。 (Ulla Kirch-Prinz& Peter Prinz)

示例:

cout << dec << -1 << " " << hex << -1;

此语句在32位系统上导致以下输出:

-1 ffffffff

有人可以解释为什么第二个输出是ffffffff

我在书中解释说:

  

当输出八进制或十六进制数时,该数字的位   要输出总是被解释为无符号!换句话说,   输出显示八进制或十六进制数字的位模式   格式。

3 个答案:

答案 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

参考文献:

http://en.cppreference.com/w/cpp/language/integer_literal

https://en.wikipedia.org/wiki/Two%27s_complement