C++ char算术溢出

Nik*_*rma 1 c++

#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;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码产生正常的int值,如果127 > x > -127 是溢出值,则产生其他值.我无法理解如何计算溢出值.在这种情况下为-80.谢谢

Pau*_*bel 5

这里的诀窍是如何表示数字.看看2的补充.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.