定点数
整数和小数
以下码制均是解决如何表示正负
原码
符号+数值。
整数:正数0/负数1+数值
小数:正数0/负数1+数值
有0000 0000(+0)与1000 0000(-0)之分。
所以整数范围是从-127(1111 1111)~+127(0111 1111)
小数范围是从-(1-2-7) [1111 1111]~+(1-27) [0111 1111](8位)
补码
先不管正负,写出对应二进制。(1)若为正数,则不变(2)若为负数,则每位取反,末位加1[从右往左找到第一个1,1左边的(包括)不变,1右边的取反]
这种码制是为了加减法而诞生的,所有加减法,都视为加法(减法视为加上一个负数),结果无需变化,仍然为补码。
整数:正数0/负数1+数值(负数需变换)
小数:正数0/负数1+数值(负数需变换)
由此衍生出变形补码,两位符号位,正数00,负数11。若计算后为00/11,则无溢出;若为01/10,则溢出。
无+0与-0之分,只有+0。
所以整数范围从-128 [1000 0000] ~ +127 [0111 1111]
小数范围从-1[1000 0000] ~ +(1-2-7) [0111 1111]。
反码
正数不变,负数每位取反
这种码制用的不多,不如补码方便,也不如原码直观。
有+0(0000 0000)与-0(1111 1111)之分。
所以整数范围从-127(1000 0000) ~ +127(0111 1111)
小数范围从-(1-2-7)[1000 0000] ~ +(1-2-7)[0111 1111]
移码
补码+偏移量28-1。求出补码,再将补码符号位取反。
符号1为正 0为负
为了比较而生。可以直接通过比较移码的码值,来判断两个数的大小。主要用于浮点数的阶码表示,所以一般只有整数。
无+0(1000 0000)与-0之分。
所以整数范围从-128[0000 0000] ~ +127[1111 1111]
注意:IEEE-754浮点数中采用的偏移量不是2n-1。
四种码制比较
除了原码,同为(正的/负的):真值越大对应的码值也越大
而原码,同为正的:真值越大对应的码值也越大;同为负的,:真值越大对应的码值越小。
原码和反码是类似的:反码是由原码各位取反得到的,它们都有+0 -0。
补码和移码是类似的:补码是由反码加1得到的,他们都只有+0。
补码为了计算、阶码为了比较
浮点数
浮点数其实是二进制的科学计数法。
F=M×2E M是尾数,E是阶数。存下M E就能表示一个二进制数。
M一般是用补码小数来表示。而E一般是用移码整数来表示/也有补码
浮点数加减运算时,需要对阶,利用阶码就能快速知道哪个阶码大,阶码也方便规格化
分为非规格化浮点数(类似0.005 ×10-3这种不按规矩写的) 和 规格化浮点数(类似2.5 × 108这种按规矩写的)
规格化浮点数 尾数(补码)M>0:M=0.1XXX;M<0:M=1.0XXX;
规格化正数范围:1/2 ~ 1-2-n+1 规格化负数 -(1/2+2-n+1) ~ -1
规格化:把非规格化 转化成 规格化。
左规:尾数左移一位,阶码减一 ;右规:尾数右移一位,阶码加一
范围计算
非规格化浮点数范围
E阶码 补码/移码 整数 数值位k位 范围-2k ~ 2k-1
M尾数 补码 小数 数值位n位 正数范围2-n~ 1-2n 负数范围-1 ~ -2-n
最小负数 尾数负数最小 -1 阶码最大 2k-1
最大负数 尾数负数最大-2-n 阶码最小 -2k
最小正数 尾数正数最小2-n 阶码最小-2k
最大正数 尾数正数最大1-2n阶码最大2k-1
规格化浮点数
阶码范围与上相同
E阶码 补码/移码 整数 数值位k位 范围-2k ~ 2k-1
M尾数 补码 正数范围 0.5 ~ +(1-2-n) 0100 0000~0111 1111
负数范围-1 ~ -(1/2+2-n) 1000 0000~1011 1111
最小负数 尾数负数最小-1 阶码最大2k-1
最大负数 尾数负数最大-(1/2+2-n)阶码最小-2k
最小正数 尾数正数最小0.5 阶码最小-2k
最大正数 尾数正数最大+(1-2-n) 阶码最大2k-1
IEEE-754
C语言就是用IEEE-754
单精度 32bit
<-high s 数符(1bit); e 阶码(8bit)f 尾数(23bit) low<-
f(无符号原码 说是原码也不准确 原码1.xxx表示负数 而在这里1.xxx表示正数)f>0 f=1.xxx; 所以将1舍去 f只记录xxx
e(特殊移码)阶码的偏移量为+127 我们先前讲的移码偏移量为+128
补码转换IEEE-754移码:最高位取反,然后减去1;
为什么为127?没看懂
然后把e = 0(表示0/次规格化数) e=255(正负无穷大/NaN) 都挖掉了,所以阶码范围-126~127
s=0 为正数;s=1 为小数
范围
阶码范围 -126 ~+127
尾数范围(1+0)~(1+1-2-23)
正数范围1.2e-38~3.4e38 小数和整数的量级是接近的
大端法 小端法
小端法:小的数字存在字节小的地方
存放的是01 23 45 67
小端法每次看到都有些怪异 因为一个字节可以存放两个十六进制数。
Linux Windows均是小端法