大小尾数
小尾数:低位字节存储在低内存位置或寄存器的低位地址,高位字节存储在高内存位置或寄存器的高位地址。
大尾数:和小尾数的存储顺序是相反的,低位字节存储在高位地址。
intel采用的是小尾数存储格式:
检测:
.section .data
value:
.int 0x127
.section .text
.global main
main:
nop
movl $0x127,%ebx
int $0x80
查看内存情况:
(gdb) x/x &value
0x8049664 <value>: 0x27
(gdb) x/4x &value
0x8049664 <value>: 0x27 0x01 0x00 0x00
(gdb) p/x $ebx
$1 = 0x127
(gdb) p/x $bx
$2 = 0x127
(gdb) p/x $bl
$3 = 0x27
(gdb) p/x $bh
$4 = 0x1
负数的数学计算
在计算机中,四则运算以加法为基础。理解负数在计算机中以补码表示,负数和非负数的加法计算,负数和负数的加法计算很重要。
使用gdb简单查看负数的加法操作:
汇编:
.section .text
.global main
main:
nop
movl $24,%edx
movl $-35,%ecx
addl %edx,%ecx
movl $-24,%edx
addl %edx,%ecx
int $0x80
gdb调试:
Temporary breakpoint 1, main () at negtive.s:4
4 nop
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.192.el6.i686
(gdb) n
5 movl $24,%edx
(gdb) n
6 movl $-35,%ecx
(gdb) n
7 addl %edx,%ecx
(gdb) p/t $edx
$1 = 11000
(gdb) p/t $ecx
$2 = 11111111111111111111111111011101
(gdb) n
8 movl $-24,%edx
(gdb) p/t $ecx
$3 = 11111111111111111111111111110101
(gdb) p $ecx
$4 = -11
(gdb) n
9 addl %edx,%ecx
(gdb) p $edx
$5 = -24
(gdb) p/t $edx
$6 = 11111111111111111111111111101000
(gdb) n
10 int $0x80
(gdb) p $ecx
$7 = -35
(gdb) p/t $ecx
$8 = 11111111111111111111111111011101
整个过程简单地说是这样的:
00000000000000000000000000011000 +
11111111111111111111111111011101 =
11111111111111111111111111110101
即是:24 + -35 = -11
11111111111111111111111111101000 +
11111111111111111111111111110101 =
11111111111111111111111111011101
即是:-24 + -11 = -35
标准浮点数据
标准浮点数据类型,IEEE标准754顶的浮点数
32位单精度浮点数
因为假设有效数字的整数值是1,并且不在有效数字值中使用它,所以精度就变成了23+1=24。
指数使用8位,那么它的范围应该是-128~127.
单精度浮点数最大绝对值是 1.9˙×2127≈1.9˙×1.701×1038≈3.4×1038
64位双精度浮点数
指数的位数是11,2^11=2048,那么指数的范围是-1024~1023.
双精度的最大绝对值估计为: 1.9˙∗21023≈1.79×10308
拓展双精度
IA-32平台,拓展双精度格式使用在80位FPU寄存器中。
指数位是15,2^15=32768,那么指数的范围是-16384~16383,拓展双精度的最大绝对值是: 1.9˙×216383≈1.18×104932
由此我们得到下面这张表:
数据类型 | 长度 | 有效数字位 | 指数位 | 精度范围 |
---|---|---|---|---|
单精度 | 32 | 23 | 8 | 1.18×10−38∼3.4∗1038 |
双精度 | 64 | 53 | 11 | 2.23×10−308∼1.79×10308 |
拓展双精度 | 80 | 64 | 15 | 3.37×10−4932∼1.18×104932 |
最小的精度值我没能想通它是怎么算出来的。望交流。
浮点数转化成二进制
(例子讲解12.23转化成01000001010000111010111000010100):
1. 提取小数部分0.23,乘以2,如果整数部分是1,那么十分位是1,否则是0 0.23×2=0.46decimals: