字节顺序
小端
最低有效字节在最前面
大多数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 |
无符号数
假设一个整数数据有ww位,可以将位向量写成表示整个向量,或者写成[xw−1,xw−2,…,x0][xw−1,xw−2,…,x0]表示向量中的每一位
二进制转无符号数
有符号数
原码编码
反码编码
补码编码
最高有效位xw−1xw−1称为符号位,权重为−2w−1−2w−1
B2TwB2Tw是一个从长度为ww的位模式到和TMaxwTMaxw之间数字的映射,写做
注意
- |TMinw|=|TMaxw|+1|TMinw|=|TMaxw|+1
- UMaxw=2TMaxw+1UMaxw=2TMaxw+1
有符号数和无符号数转换
无符号数到补码
补码到无符号数
扩展数位
零扩展
无符号数转换为一个更大的数据类型,只需要简单地在表示的开头添加0
符号扩展
将一个补码数字转换为一个更大的数据类型,需要添加最高有效位的值的副本
截断数字
无符号数的截断结果
有符号数补码的截断结果
整数运算
无符号数加法
有符号数补码加法
有符号数补码的非
无符号数乘法
有符号数补码乘法
乘以常数
对于某个常数KK的表达式生成代码,编译器会将KK的二进制表示为一组0和1交替的序列
考虑一组从位位置nn到位置的连续的1(n≥mn≥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),当nn为最高有效位
除以2的幂
无符号数除以2的幂
有符号数补码除以2的幂
浮点数
二进制小数
形如bmbm−1bm−2...b1b0.b−1b−2...b−n+1b−nbmbm−1bm−2...b1b0.b−1b−2...b−n+1b−n的表示法,其中每个二进制数字或者位,bibi的取值范围是0和1,则
符号
.
变为了二进制的点,点左边的位的权是2的非负幂,右边是负幂
小数的二进制表示法只能表示那些能够被写成x×2yx×2y的数,其它值职能被近似
IEEE浮点表示
使用V=(−1)s×M×2EV=(−1)s×M×2E的形式表示一个数
- 符号ss决定这个数是负数(1)还是整数(0)
- 阶码的作用是对浮点数加权,权重是2的EE次幂
- 尾数是一个二进制小数,范围是1∼2−ϵ1∼2−ϵ,或者0∼1−ϵ0∼1−ϵ
将浮点数的位表示划分为三个字段,分别编码
- 1位的符号位ss编码符号
- kk位的阶码字段编码阶码EE
- 位的小数字段frac=fn−1...f1f0frac=fn−1...f1f0编码尾数MM
值的表示
- 规格化的值
s | exp | frac |
---|---|---|
s | 非0 && 非全1 | frac |
阶码,其中expexp是无符号数,位表示为exp=ek−1...e1e0exp=ek−1...e1e0,偏置值Bias=2k−1−1Bias=2k−1−1
小数字段fracfrac解释为描述小数值ff,其中,其二进制表示为0.fn−1fn−2...f1f00.fn−1fn−2...f1f0,尾数M=1+fM=1+f,这种方式叫做隐含以1开头的表示,MM的二进制表示为
- 非规格化的值
s | exp | frac |
---|---|---|
s | 0 | frac |
阶码值E=1−BiasE=1−Bias
尾数M=fM=f
提供了一种表示0的方法。+0.0的浮点表示的位模式为全0,-0.0的服点表示为符号位为1,其它为0
可以表示非常接近于0.0的数,并且是均匀接近于0.0,叫做逐渐溢出
特殊值
- 无穷大
s exp frac s 全1 0 阶码值EE全为1
尾数全为0
符号ss为0的时候表示,符号ss为1的时候表示能够表示溢出
- NaN
s exp frac s 全1 非0 阶码值EE全为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+ba≥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∗fa≥x∗fb(2)a≥b and c≤0→x∗fa≤x∗fb(3)a≠NaN→a∗fa≥0