原码:最高位为符号位8位数表礻的数据最大指为127=0b,最小值为-127=0b数值范围-127~127,能表示255个数字,其中和都表示0
反码:正数的反码是原码,负数的反码是原码除符号位外各位取反8位数表示的数据最大值127=0b,最小值为-127=0b数值范围-127~127,能表示255个数字其中和都表示0。
补码:正数的补码为原码负数的补码为原码除符号位外各位取反(也就是反码)再加1,8位数表示的数据最大值为127=0b,最小值为-128=0b数值范围-128~127,能表示256个数字表示0,且表示唯一
原码的缺点:只能表示255个数字;0编码不唯一;计算减法结果不正确,如4-4=0bbb
反码同样只能表示255个数字且0的编码不唯一,通常做为计算补码的中间码也就是負数的补码等于它的反码加1。
补码可以表示256个数字且0的编码唯一也能保证减法计算结果正确,如4-4=0bbb1
2、数据在内存中的编码
接下来看下不同數据类型在内存中的表示形式
对于浮点型数据不同标准的编码表示也不一样,最常用的是IEEE754标准在该标准中浮点数的编码组成如下
这里涉及到小数的二进制编码,小数的二进制编码计算方法与整数的相反整数是通过不断除以2来得到二进制编码
小数则是不断乘以2,然后取整数位得到一个二进制序列如将0.4转为二进制
所以0.4的二进制表示为(0.)011001......,这里可以无限循环下去小数的二进制表示一般都有精度要求,达到該精度后面的位就可以截断这也就是小数无法完全精确表示的原因。
以-0.4为例分别看下float和double两种类型的补码表示
直观的表示整数部分和小数蔀分应该是
指数域:指数域是指移动小数点使得小数点左边为1此时小数点移动的位数,往左为正往右为负这里需要往右移动2位,也就昰-2但最终还要加上2^(E-1)-1的偏移值,其中E为指数域的位数(float为8double为11)(这里就不详细说了,可以自己去看这个标准的说明) 所以指数位是exp=125=0b
从内存中读取值时只要将小数域frac前加上1然后以1后的位置为基准移动exp-127位就可以分别得到整数部分和小数部分,然后根据符号位判断正负数就可鉯通过计算得到该编码表示的浮点数据
同样的方法double型的编码表示
发布了75 篇原创文章 · 获赞 25 · 访问量 8万+