C ++ char算术溢出

时间:2016-04-12 13:35:46

标签: c++

MyFaces

如果#include <stdio.h> int main() { char a = 30; char b = 40; char c = 10; printf ("%d ", char(a*b)); char d = (a * b) / c; printf ("%d ", d); return 0; } ,上面的代码会产生正常的int值 和其他溢出值。我无法理解如何计算溢出值。在这种情况下为-80。 感谢

2 个答案:

答案 0 :(得分:5)

这里的技巧是如何表示数字。看看2's complement。 30 * 40的二进制是1200或10010110000 base 2.但是我们的char只有8位,因此我们切断前导100(以及之前的所有隐含的0)。这给我们留下了1011000

注意前导1.在2s补码中,您的计算机可能如何存储值,这表示负数。 11111111为-1,11111110为-2,依此类推。如果下降到1011000,我们到达-80。

也就是说,如果我们将1011000转换为2s补码,我们将留下-80。

你可以手工做2s补。取值,删除前导符号位并交换其他值。在这种情况下,10110000在二进制中变为01001111,这将是79.将其变为负数并再删除一个,因为我们不从零开始,我们在-80。

答案 1 :(得分:1)

Char只有1个字节。在这种情况下,1200是0100 1011 0000(二进制)。 对于一个字节,您只能分配8位,在您的情况下:1011 0000(前4位将被删除)。现在你有-80(第一位显示负数(1)或正数(0))。 尝试使用您的计算器(程序员)并输入1200十进制数并从Qword切换到Byte,您可以看到您的数字会发生什么。