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。
感谢
答案 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,您可以看到您的数字会发生什么。