两个补码编码负值

时间:2014-09-08 11:20:13

标签: c encoding numbers twos-complement

在阅读“计算机系统”一书的同时,从程序员的角度来看。我发现如果我在数据类型的范围内取大部分负值,例如:

char a = -128;
a = - a;

变量a仍然具有-128的值,我理解但是当我做

char a = 50;
char b = -128;
char r = a - b;

它给我正确的结果-78,为什么?它因为自动升级到int或者有硬件减法而不需要计算两个补码-128 ??

1 个答案:

答案 0 :(得分:0)

char a = -128;表示char a = 0x80;,因此在促销到int时,它将是0xFFFFFF80-0xFFFFFF80 = 0x00000080并将其转换为与起始值相同的char 0x80

char a = -128;
char b = 50;
char r = a - b;

0xFFFFFF80
0xFFFFFFCE
   =
0xFFFFFF4E

所以4E将写在r中,即+78。

现场演示:https://ideone.com/sjyBOa