CSAPP阅读笔记1——数据编码
数据编码
假设字长(word size)为 ,也即数据的位数,则二进制向十进制的转换分别是:
- 无符号数:
- 有符号数:
左移:x向左移动k位,丢弃最高的k位,在右端补k个0;
逻辑右移 :在左端补k个0
算术右移:在左端补k个最高有效位的值
PS:移位操作优先级低于±,
无符号数编码定义:
原码:正数是其二进制本身;负数是符号位为1,数值部分取X绝对值的二进制。
最高位是符号位,用来确定剩下的位是应该取负权还是正权。
补码:正数的补码和原码,反码相同;负数是符号位为1,其它位是原码按位取反,未位加1。(或者说负数的补码是其绝对值反码未位加1)
最高位也称为符号位,其权重为
反码:正数的反码和原码相同;负数是符号位为1,其它位是原码取反。
除最高位权为而不是其余和补码一样。
编码 | 10810(sbyte) | -10810(sbyte) |
---|---|---|
原码 | 01101100 | 11101100 |
反码 | 01101100 | 10010011 |
补码 | 01101100 | 10010100 |
- 与 And:
A=1
且B=1
时,A&B = 1
- 或 Or:
A=1
或B=1
时,A|B = 1
- 非 Not:
A=1
时,~A=0
;A=0
时,~A=1
- 异或 Exclusive-Or(Xor):
A=1
或B=1
时,A^B = 1
;A=1
且B=1
时,A^B = 0
对应与集合运算则是交集、并集、差集和补集,假设集合 A 是 {0, 3, 5, 6}
,集合 B 是 {0, 2, 4, 6}
,全集为 {0, 1, 2, 3, 4, 5, 6, 7}
那么:
-
&
交集 Intersection{0, 6}
-
|
并集 Union{0, 2, 3, 4, 5, 6}
-
^
差集 Symmetric difference{2, 3, 4, 5}
-
~
补集 Complement{1, 3, 5, 7}
类型转换
我们在数轴上把有符号数和无符号数画出来的话,就能很清晰的看出相对的关系:
在 C 语言中,如果不加关键字限制,默认的整型是有符号的。如果想要无符号数的话,需要在数字后面加 U,例如下面的代码段
1 | int a_signed_number = -15213; |
在进行有符号和无符号数的互相转换时:
-
具体每一个字节的值不会改变,改变的是计算机解释当前值的方式
-
如果一个表达式既包含有符号数也包含无符号数,那么会被隐式转换成无符号数进行比较
表达式 | 比较对象 | 求值 |
---|---|---|
0 == 0U | 无符号数 | 1 |
-1 < 0 | 有符号数 | 1 |
-1 < 0U | 无符号数 | 0* |
2147483647 > (-2147483647-1) | 有符号数 | 1 |
2147483647U < (-2147483647-1) | 无符号数 | 0* |
-1 > -2 | 有符号数 | 1 |
(unsigned)-1 > -2 | 无符号数 | 1 |
2147483647 < 2147483648U | 无符号数 | 1 |
2147483647 > (int)2147483648U | 有符号数 | 1* |
注:*号标注的为比较反直觉的一些结果
参考文章
今日体重更新
今天和朋友出去搓了顿周麻婆,体重略有上涨,意料之中。。。