2022-09-05 符号位、浮点数、原码、补码、反码、移码

符号位、浮点数、原码、补码、反码、移码

  • 无符号数和有符号数
    • 无符号数
    • 有符号数
    • 浮点数
  • 真值、原码、补码和反码
      • 真值
      • 原码
      • 补码
      • 反码
      • 移码
    • 总结

无符号数和有符号数

无符号数

无符号表示范围
1个字节,十六位表示范围0x00~0xFF,十位表示范围0~255;
2个字节,十六位表示范围0x0000~0xFF,十位表示范围0~65535。

有符号数

以最高位表示数字正负数,0位正,1为负;
2022-09-05 符号位、浮点数、原码、补码、反码、移码_第1张图片

小数点的位置以约定的位置,如4字节最高位表示符号位,剩余31位有8位指数位23位尾数位构成。

浮点数

2022-09-05 符号位、浮点数、原码、补码、反码、移码_第2张图片

2022-09-05 符号位、浮点数、原码、补码、反码、移码_第3张图片
2022-09-05 符号位、浮点数、原码、补码、反码、移码_第4张图片

真值、原码、补码和反码

真值

也就是日常中使用的算数值1、-1、2、-2具有正负数的值;

原码

在计算机中完全是由0或1组成的,这里使用1个字节也就是8个bit进行表示;只用在正负数上与真值有较大的差异。原码是在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0,在原码中区分正负零),其余位表示数值的大小。

例子:

  • 真值1,原码表示为0x00000001
  • 真值-1,原码表示为0x10000001
  • 真值2,原码表示为0x00000010
  • 真值-2,原码表示为0x10000010

补码

由于原码(+0=-0)在计算中不方便进行计算,则使用补码进行加法运算;补码正数则是自身,负数则是原码的取反加一。

例子:

  • 真值1,原码0x00000001,补码表示为0x00000001
  • 真值-1,原码0x10000001,补码表示为0x101111111
  • 真值2,原码0x00000010,补码表示为0x00000010
  • 真值-2,原码0x10000010,补码表示为0x11111110

1个字节计算:

  • (+2) + (-1)0x00000010 + 0x11111111 = 0x00000001,也就是1;
  • (+2)-(-1)则转变为(+2)+(+1)也就是将0x00000010 - 0x11111111转变为0x00000010 + 0x00000001=0x00000011,也就是3。

将减法操作转为加法操作,进而简化cpu处理逻辑。

反码

反码(+0!=-0)与补码的区别在于原码进行转换时,只需要取反,不用加1。

移码

对于存在计算中的数字在进行比较大小时,如何区分1和-1的大小呢,所以就需要移码了,对于1个字节也就是8个bit表示为1和-1的补码,需要加2^8次方,再进行比较

2022-09-05 符号位、浮点数、原码、补码、反码、移码_第5张图片

也就是在符号位上加1,这样再进行数值比较时,就不会出错了

2022-09-05 符号位、浮点数、原码、补码、反码、移码_第6张图片

总结

  • 对于正数,原码=补码=反码
  • 对于负数,符号位为1,其数值部分(原码除符号位外每位取反末位加1 得补码;原码除符号位外每位取反 得反码)

你可能感兴趣的:(#,计算机基础知识,linux)