二进制整数运算
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 | 1 00000010 |
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);
int minValue = int.MinValue;
Console.WriteLine(minValue);
Console.WriteLine(negativeOne * minValue);
没有评论:
发表评论