1、uchar 类型只能保存0-255的数字。超过了会溢出,溢出后会从0开始继续累加。所以小心使用
uchar u;
u +=u;
溢出了也不会提醒你
2、
计算机CPU只有加法逻辑运算器,对于减法运算,是使用两个数的补码进行加法运算。
50-100=?
50的二进制是: 00000000|00000000|00000000|00110010
50的补码是: 00000000|00000000|00000000|00110010(整数的补码不变)
100的二进制是: 00000000|00000000|00000000|0110010
-100的补码是: 先减1:100的二进制数 - 1
= 00000000|00000000|00000000|01100011
按位取反:00000000|00000000|00000000|01100011
= 11111111|11111111|11111111|10011100
(50的补码) + (-100的补码)是:00000000|00000000|00000000|00110010 +
11111111|11111111|11111111|10011100
= 11111111|11111111|11111111|11001110
如果是无符号数,二进制转十进制:
11111111|11111111|11111111|11001110 = 4294967246
如果是有符号数,二进制转十进制:
11111111|11111111|11111111|11001110首位是1表示负数,
先减1:11111111|11111111|11111111|11001101
按位取反:00000000|00000000|00000000|00110010
有符号数结果: - (1*2^5 + 1*2^4 + 1*2^1)=-50
补码:
正数的补码,是其本身。
负数的补码,就用它的正数,减一取反,即可得到补码。
如,已知:+9 补码是:0000 1001。
下面求-9 补码:
先减一:0000 1001 - 1 = 0000 1000;
再取反:1111 0111。
所以有:-9 补码 = 1111 0111。
3、
50-100=-50, -50的二进制是补码表示为50取反+1,
50: 00000000|00000000|00000000|00110010
取反: 11111111|11111111|11111111|11001101
加1: 11111111|11111111|11111111|11001110 就是无符号数的 4294967246