新鲜、有趣,互联生活。令狐葱。

2006/11/20

二进制整数运算

n位无符号整数的范围0~2n - 1
n位有符号整数范围-1 * 2(n - 1)~2(n - 1) - 1
以8位为例,无符号整数二进制表示如下(0~255):
Decimal Binary
0 00000000
1 00000001
2 00000010
3 00000011
...
252 11111100
253 11111101
254 11111110
255 11111111
有符号整数二进制表示如下(-128~127):
Decimal Binary
127 01111111
126 01111110
125 01111101
124 01111100
...
3 00000011
2 00000010
1 00000001
0 00000000
-1 11111111
-2 11111110
-3 11111101
-4 11111100
...
-125 10000011
-126 10000010
-127 10000001
-128 10000000
注意:
1. 加法运算
91 01011011
+ 31 + 00011111
122 01111010
直接相加即可,注意无符号和有符号混合运算,这样也可以得到正确结果,前提是:溢出的一位要丢弃。
7  00000111
+ -5   +  11111011
2 100000010
2. 计算一个有符号整数的相反数的方法是取反加一。
比如 1 二进制00000001,取反11111110,加一,11111111(就是-1了)
同样,对0也是适用的。
有一个特殊情况:
3. 对-128,由于不存在值128的8位整数,所以利用取反加一得到:
-128(10000000),取反,01111111,加一,10000000(又得到它本身,也就是说-128 * -1 == -128
T.MinValue * -1 == T.MinValue.这种结果对求绝对值的运算也是一样。
在C运行时环境,abs(-2147483648) == -2147483648.
但是在C#中,求最小数的绝对值运算Abs会抛出异常,但是直接乘-1不会有异常,结果同上所述。
可以做如下测试:
int negativeOne = -1;
int minValue = int.MinValue;

Console.WriteLine(minValue);
Console.WriteLine(negativeOne * minValue);
 

没有评论: