繁体   English   中英

C ++中的十六进制输出

[英]Output of hexadecimal in C++

这是“ C ++编程完整指南”中的示例(Ulla Kirch-Prinz和Peter Prinz)

例:

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

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

-1 ffffffff

谁能解释为什么第二个输出是ffffffff吗?

我对书中的解释有疑问:

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

那是因为大多数现代机器都使用二进制补码整数表示。

在二进制补码中,最高位用作符号位。 如果已设置,则该数字被视为负数,并且要获得其绝对(正)值,您需要从2 N中减去它,即取其2的补数。

如果您有8位数字00000001,则其2的补码将为100000000-00000001 = 11111111(或0xFF十六进制)。 因此-1以二进制形式表示为全1。

这是一个非常方便的系统,因为您可以执行算术运算,就好像数字是无符号的(让它们溢出)一样,然后只需将结果解释为有符号,就可以了。

编译器通过以下方式为有符号变量实现负数,如果最高位为true,则您的数字实现为(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    

您突出显示的文本是说输出等于

cout << dec << -1 << " " << hex << (unsigned)-1;

在2的补码系统(当今任何台式机都在使用)中, -1的位模式将所有位设置为1。

因此对于32位int ,输出将为ffffffff

最后,请注意,如果int (因此为unsigned )为32位,则文字0xffffffff类型unsigned


参考文献:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM