char chr = 127; int sum = 200; chr += 1; sum += chr;后,sum的值是()
备注:同时考虑c/c++和Java的情况的话
. | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
二进制数 | 0/1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
换算数 | +/- | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
原码以左边第一位为表示正负的符号位:0111 1111 = +(64+32+16+8+4+2+1) = +127
java里的byte
进行+=
运算也会溢出到符号位:0111 1111 + 1 = 1000 0000
反码——将0变成1,1变成0,符号位不变:1000 0000 = 1111 1111
补码——向前挪一位,在换算成10进制后再-1:1111 1111 -> -(64+32+16+8+4+2+1)-1 = -128
为什么是要减1?
因为0000 0000
代表0,1000 0000
代表-1,负数以-1为起始而非-0,所以要多减一。
为什么要补码等等问题,可以看看这个牛V的知乎回答!超赞的!