第2章 信息的表示与处理
布尔代数
位运算
有个有趣的C语言的值交换写法,如下。
void swap(int *x, int *y){
*y = *x ^ *y;
*x = *x ^ *y;
*y = *x ^ *y;
}
没有用到第三方元素交换,很有趣,但是并没有性能上的提高。
对于这个写法,我们首先要知道异或运算,然后有
a∧a=0
a
∧
a
=
0
。
(x∧y)∧x
(
x
∧
y
)
∧
x
可以看成
x∧x∧y
x
∧
x
∧
y
,而
x∧x=0
x
∧
x
=
0
,
0∧x=x
0
∧
x
=
x
。故有上面那种写法了。
无符号数问题
无符号数的转换
补码转为无符号数
对满足
TMinw⩽TMaxw
T
M
i
n
w
⩽
T
M
a
x
w
的
x
x
有:
例如 T2U16(−12345)=−12345+216=53191 T 2 U 16 ( − 12345 ) = − 12345 + 2 16 = 53191 ,同时 T2Uw(−1)=−1+2w=UMaxw T 2 U w ( − 1 ) = − 1 + 2 w = U M a x w 。
无符号数转换为补码
对满足
0⩽u⩽UMaxw
0
⩽
u
⩽
U
M
a
x
w
的
u
u
有:
C语言中的有符号数与无符号数 (前方有高能BUG出现,要画重点!!!)
当执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么C语言会隐式地将有符号参数强制类型转换为无符号数,并假设这两个数都是非负的,来执行这个运算。就像我们将要看到的,这种方法对于标准的算术运算来说并无多大差异,但是对于像 < < <script id="MathJax-Element-911" type="math/tex"><</script>和 > > 这样的关系运算符来说,它会导致非直观的结果。如下表所示。