美文网首页
计算机数值表示

计算机数值表示

作者: wayyyy | 来源:发表于2017-10-18 23:37 被阅读0次

今天偶然碰到补码反码,才发现自己一直搞错了一个事实,n位二进制表示的原码,反码,补码范围是不一样的。于是重新在纸上画一画,总结总结。

以8位2进制为例:

码制 范围
原码 -127 ~ 127
反码 -127 ~ 127
补码 -128 ~ 127

为什么补码会比原码和反码多一个呢?8位2进制编码结果一共有256种。原码和反码127*2+1=255种,而补码是128+127+1=256种。问题是出在0上。

  • 原码:
    0000 0000 ~ 0111 1111 : 0 ~ 127
    1000 0000 : -0
    1000 0001 ~ 1111 1111: -1 ~ -127

  • 反码:正数的反码和原码一致,负数的反码是原码除符号位以外取反
    0000 0000 ~ 0111 1111 : 0 ~ 127
    1111 1111 : -0
    1111 1110 ~ 1000 0000 : -1 ~ -127

  • 补码:正数的补码和反码一致,负数的补码是反码加1
    0000 0000 ~ 0111 1111 : 0 ~127
    [1]0000 0000: -0
    1111 1111 ~ 1000 0001 :-1 ~ -127
    注:[1]截断,则0和-0相同,和数学统一。

从上面可以看出:[+0]和[-0]的原码和反码都是不一样,而补码是一样的。所以原码和反码只有255个,补码多出一个编码1000 0000没有用,于是规定用这个来表示-128。

顺便在谈一点为什么计算机采用补码表示数值?

  1. 因为原码和反码中0有2种编码规则,而补码只有一种。
  2. 更重要的是看下面:
    • [1]原 - [1]原 = [1]原 + [-1]原:
      0000 0001 + 1000 0001 = 1000 0001 显然结果是错的。
    • [1]反 - [1]反 = [1]反 + [-1]反:
      0000 0001 + 1111 1110 = 1111 1111 = -0 在数学中0没有正负。
    • [1]补 - [1]补 = [1]补 + [-1]补:
      0000 0001 + 1111 1111 = [1]0000 0000 [1]截断,此时结果为0的补码。正确

从上面看出,补码运算时不需要考虑符号位的问题,符号位可以直接参与计算,且0的表示方式唯一不分正负,也是符合数理逻辑。

顺便说到,unsigned int使用有时候要注意:

// 伪代码
for (unsigned int8 n = 5; n >= 0; n--) {
    //...
}

这种写法应该是一种死循环,[0] - [1] = [0] + [-1] = 0000 0000 + 1111 1111 = 1111 1111。定义为unsigned时,编译器会采用无符号数来解释,于是[1111 1111]被解释为512。也就永远不会跳出循环。

相关文章

  • 计算机数值表示

    今天偶然碰到补码反码,才发现自己一直搞错了一个事实,n位二进制表示的原码,反码,补码范围是不一样的。于是重新在纸上...

  • 组成原理计算机数值表示

    今天偶然碰到补码反码,才发现自己一直搞错了一个事实,n位二进制表示的原码,反码,补码范围是不一样的。于是重新在纸上...

  • 自然语言处理---文本表示

    1. 引言 所谓文本表示既是通过某种形式将文本字符串表示成计算机所能处理的数值向量。那么为什么要进行文本表示,根本...

  • 导论 - 草稿

    第一部分: 理论计算机基础 1: 数值的表示: 半斤八两 语法与语义 2: 数值的运算。 规则与变换过程 3: 自...

  • Javascript面试应该注意的点

    NaN(Not a Number,非数)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。 基本数据类...

  • 定点数和浮点数

    在选择计算机的数据表示方式时,通常需要考虑4点因素: 要表示的数据类型(整数,小数,实数和复数) 数值范围 精确度...

  • 2018-04-21二进制(原码,反码,补码)

    计算机中的符号数有三种表示方法,即原码, 补码, 反码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“...

  • mysql8 数据类型 float double decimal

    float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都...

  • 【408考研笔记】计算机组成原理与思维导图(一)第一章 计算机系

    计算机组成原理与思维导图(一) 附:【408考研笔记】计算机组成原理与思维导图(二)第二章 数值数据的表示[htt...

  • 原码,补码,反码

    前言 一个数值在计算机中是以二进制存在的,我们管这样的数值叫“机器数”,而表示机器数的范围和“机器字长”息息相关。...

网友评论

      本文标题:计算机数值表示

      本文链接:https://www.haomeiwen.com/subject/ejyyuxtx.html