【发布时间】:2022-01-10 11:10:20
【问题描述】:
我有一个关于 C++ Primer 中练习 4.25 的问题:
练习 4.25:在 32 位机器上 ~'q'
我有二进制的解决方案,但我不明白它是如何转换为 int 的:
int main()
{
cout << (std::bitset<8 * sizeof(~'q' << 6)>(~'q' << 6))<<endl;
cout << (~'q' << 6) << endl;
return 0;
}
执行后,打印以下2行:
11111111111111111110001110000000
-7296
第一行是我所期望的,但我不明白它是如何转换为-7296的。 我希望有更多的数字。在线转换器也给出了不同的结果。
提前感谢您的帮助。
【问题讨论】:
-
您是否对
11111111111111111110001110000000表示整数-7296感到困惑。这是因为 2s 补码表示的工作原理:可能的最小数字表示为1000...00,加一会将数字加一,直到达到111...11,即-1。 -
顺便说一句:假设您使用的是 windows(不确定 linux 等是否提供类似功能),您可以稍微玩一下 2s compelement 表示:启动计算器并进入程序员模式,然后对于 32 位数字,切换到 DWORD;您将能够并行查看十进制、十六进制、八进制和二进制表示。
-
嗯,好的,现在我明白了。我对负数的表示如何工作有不同的想法。我认为最高位代表 +/- 符号,其余位使用与无符号值相同的方法给出值。 (所以我认为,例如,带符号的 int 0001 = +1 和 1001 = -1)但现在很清楚,谢谢。 :)