字节顺序
小端
最低有效字节在最前面
大多数Intel兼容机
0x01234567
地址 | … | 0x100 | 0x101 | 0x102 | 0x103 | … |
---|---|---|---|---|---|---|
数据 | … | 67 | 45 | 23 | 01 |
大端
最高有效字节在最前面
大多数IBM和Sun Microsystems
网络应用程序发送和接受的数据
0x01234567
地址 | … | 0x100 | 0x101 | 0x102 | 0x103 | … |
---|---|---|---|---|---|---|
数据 | … | 01 | 23 | 45 | 67 |
双端
可以设置成大端或者小端
移位运算
逻辑移位(
>>>
,<<<
)左移和右移补0
算术移位(
>>
,<<
)左移补符号位,右移补0
整数表示
32位机器C语言的整型数据类型的典型取值范围
数据类型 | 最小值 | 最大值 |
---|---|---|
char | -128 | 127 |
unsigned char | 0 | 255 |
short [int] | -32768 | 32767 |
unsigned short [int] | 0 | 65535 |
int | -2147483648 | 2147483647 |
unsigned [int] | 0 | 4294967295 |
long [int] | -2147483648 | 2147483647 |
unsigned long [int] | 0 | 4294967295 |
long long [int] | -9223372036854775808 | 9223372036854775807 |
unsigned long long [int] | 0 | 18446744073709551615 |
64位机器C语言的整型数据类型的典型取值范围
数据类型 | 最小值 | 最大值 |
---|---|---|
char | -128 | 127 |
unsigned char | 0 | 255 |
short [int] | -32768 | 32767 |
unsigned short [int] | 0 | 65535 |
int | -2147483648 | 2147483647 |
unsigned [int] | 0 | 4294967295 |
long [int] | -9223372036854775808 | 9223372036854775807 |
unsigned long [int] | 0 | 18446744073709551615 |
long long [int] | -9223372036854775808 | 9223372036854775807 |
unsigned long long [int] | 0 | 18446744073709551615 |
无符号数
假设一个整数数据有 w w 位,可以将位向量写成表示整个向量,或者写成 [xw−1,xw−2,…,x0] [ x w − 1 , x w − 2 , … , x 0 ] 表示向量中的每一位
二进制转无符号数
有符号数
原码编码
反码编码
补码编码
最高有效位 xw−1 x w − 1 称为符号位,权重为 −2w−1 − 2 w − 1
B2Tw B 2 T w 是一个从长度为 w w 的位模式到和 TMaxw T M a x w 之间数字的映射,写做
注意
- |TMinw|=|TMaxw|+1 | T M i n w | = | T M a x w | + 1
- UMaxw=2TMaxw+1 U M a x w = 2 T M a x w + 1
有符号数和无符号数转换
无符号数到补码
补码到无符号数
扩展数位
零扩展
无符号数转换为一个更大的数据类型,只需要简单地在表示的开头添加0
符号扩展
将一个补码数字转换为一个更大的数据类型,需要添加最高有效位的值的副本
截断数字
无符号数的截断结果
有符号数补码的截断结果
整数运算
无符号数加法
有符号数补码加法
有符号数补码的非
无符号数乘法
有符号数补码乘法
乘以常数
对于某个常数 K K 的表达式生成代码,编译器会将 K K 的二进制表示为一组0和1交替的序列
考虑一组从位位置 n n 到位置的连续的1( n≥m n ≥ m ),有两种形式来计算
- (x<<n)+(x<<n−1)+…+(x<<m) ( x << n ) + ( x << n − 1 ) + … + ( x << m )
- (x<<n+1)−(x<<m) ( x << n + 1 ) − ( x << m ) ,当 n n 为最高有效位
除以2的幂
无符号数除以2的幂
有符号数补码除以2的幂
浮点数
二进制小数
形如
bmbm−1bm−2...b1b0.b−1b−2...b−n+1b−n
b
m
b
m
−
1
b
m
−
2
.
.
.
b
1
b
0
.
b
−
1
b
−
2
.
.
.
b
−
n
+
1
b
−
n
的表示法,其中每个二进制数字或者位,
bi
b
i
的取值范围是0和1,则
符号
.
变为了二进制的点,点左边的位的权是2的非负幂,右边是负幂
小数的二进制表示法只能表示那些能够被写成 x×2y x × 2 y 的数,其它值职能被近似
IEEE浮点表示
使用 V=(−1)s×M×2E V = ( − 1 ) s × M × 2 E 的形式表示一个数
- 符号 s s 决定这个数是负数(1)还是整数(0)
- 阶码的作用是对浮点数加权,权重是2的 E E 次幂
- 尾数是一个二进制小数,范围是 1∼2−ϵ 1 ∼ 2 − ϵ ,或者 0∼1−ϵ 0 ∼ 1 − ϵ
将浮点数的位表示划分为三个字段,分别编码
- 1位的符号位 s s 编码符号
- k k 位的阶码字段编码阶码 E E
- 位的小数字段 frac=fn−1...f1f0 f r a c = f n − 1 . . . f 1 f 0 编码尾数 M M
值的表示
- 规格化的值
s | exp | frac |
---|---|---|
s | 非0 && 非全1 | frac |
阶码,其中 exp e x p 是无符号数,位表示为 exp=ek−1...e1e0 e x p = e k − 1 . . . e 1 e 0 ,偏置值 Bias=2k−1−1 B i a s = 2 k − 1 − 1
小数字段 frac f r a c 解释为描述小数值 f f ,其中,其二进制表示为 0.fn−1fn−2...f1f0 0. f n − 1 f n − 2 . . . f 1 f 0 ,尾数 M=1+f M = 1 + f ,这种方式叫做隐含以1开头的表示, M M 的二进制表示为
- 非规格化的值
s | exp | frac |
---|---|---|
s | 0 | frac |
阶码值 E=1−Bias E = 1 − B i a s
尾数 M=f M = f
提供了一种表示0的方法。+0.0的浮点表示的位模式为全0,-0.0的服点表示为符号位为1,其它为0
可以表示非常接近于0.0的数,并且是均匀接近于0.0,叫做逐渐溢出
特殊值
- 无穷大
s exp frac s 全1 0 阶码值 E E 全为1
尾数全为0
符号 s s 为0的时候表示,符号 s s 为1的时候表示能够表示溢出
- NaN
s exp frac s 全1 非0 阶码值 E E 全为1
尾数非0
不是一个数
标准浮点格式
- 单精度(32=1+8+23)
s | exp | frac |
---|---|---|
(31:31) | (30:23) | (22:0) |
- 双精度(64=1+11+52)
s | exp | frac |
---|---|---|
(63:63) | (62:52) | (51:0) |
舍入
向偶数舍入
四舍六入五成双
向零舍入
向下舍入
向上舍入
浮点运算
浮点加法
- 可交换
大多浮点数有加法的逆元,无穷和NaN是例外
不可结合
单调性
a≥b→x+a≥x+b a ≥ b → x + a ≥ x + b
浮点乘法
可交换
单位元为1.0
不可结合
不可分配
单调性
a≥b and c≥0→x∗fa≥x∗fba≥b and c≤0→x∗fa≤x∗fba≠NaN→a∗fa≥0(1)(2)(3) (1) a ≥ b and c ≥ 0 → x ∗ f a ≥ x ∗ f b (2) a ≥ b and c ≤ 0 → x ∗ f a ≤ x ∗ f b (3) a ≠ N a N → a ∗ f a ≥ 0