惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
雷峰网
雷峰网
量子位
V
V2EX
S
SegmentFault 最新的问题
月光博客
月光博客
博客园 - 【当耐特】
Hugging Face - Blog
Hugging Face - Blog
V
Visual Studio Blog
大猫的无限游戏
大猫的无限游戏
T
Tailwind CSS Blog
博客园_首页
博客园 - Franky
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
美团技术团队
Y
Y Combinator Blog
The Cloudflare Blog
C
Check Point Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
腾讯CDC
B
Blog
Stack Overflow Blog
Stack Overflow Blog
P
Proofpoint News Feed

Sunshine

SpringBoot定时任务@Scheduled注解详解 | Sunshine 大端模式、小端模式解析 | Sunshine Spring事件驱动模型实践 | Sunshine IDEA好用的几款插件 | Sunshine Linux使用yum安装MySQL详细步骤(CentOS7.3) | Sunshine Windows下MySQL解压版安装配置详细步骤 | Sunshine Java使用JDBC连接SQLServer数据库(二) | Sunshine Java使用JDBC连接SQLServer数据库(一) | Sunshine Git基本操作整理 | Sunshine Oracle序列创建和使用 | Sunshine Git批量清理本地分支 | Sunshine Statement.RETURN_GENERATED_KEYS获取自增id踩坑记录 | Sunshine GitPages+Hexo搭建个人博客 | Sunshine
机器数、原码、反码、补码解析 | Sunshine
DongyangHu · 2021-02-24 · via Sunshine

机器数、原码、反码、补码

计算机使用补码进行数字的存储和运算,本文假定机器的字长为8位,探讨下机器数、原码、反码、补码之间的关系

机器数和真值

机器数

  • 计算机中一个数的二进制表示形式,称为这个数的机器数
  • 机器数带符号,在计算机中,用一个数的最高位存放符号,称为符号位,0表示正数,1表示负数

    例:1的机器数为00000001-1的机器数为10000001。此处的0000000110000001即为机器数

真值

  • 带符号位的机器数表示的真实数值称为机器数的真值
  • 因为机器数的最高位为符号位,因此机器数表示的形式值并不一定等于真正的数值(10000001转换为十进制为129,并不代表机器数的真正数值,真值为-1)

    例:00000011的真值为310000011的真值为-3

原码、反码、补码

原码、反码、补码为机器数表示的三种形式,正数的原码、反码、补码都是其本身

原码

  • 原码就是机器数真值的绝对值加上符号位。也就是最高位为符号位,其余位表示数值

    [+1] = 0000 0001

    [-1] = 1000 0001

  • 第一位为符号位,其表示范围

    [1111 1111, 0111 1111]

十进制值为

[-127, 127]

反码

  • 在原码的基础上,正数的反码是其原码本身,负数的原码为符号位不变,其余位取反

    [+1] = [0000 0001] = [0000 0001]

    [-1] = [1000 0001] = [1111 1110]

补码

  • 在原码的基础上,正数的补码也是其原码本身,负数的补码为符号位不变,其余位取反后+1,及反码+1

    [+1] = [0000 0001] = [0000 0001] = [0000 0001]

    [-1] = [1000 0001] = [1111 1110] = [1111 1111]

补码计算

  • 1 - 1 = 0

    1 - 1 = 1 + (-1) = [0000 0001] + [1000 0001] = [0000 0001] + [1111 1111] = [0000 0000] = [0000 0000] = 0

  • (-127) + (-1) = (-128)

    (-127) + (-1) = [1111 1111] + [1000 0001] = [1000 0001] + [1111 1111] = [1000 0000] = -0

在用补码运算的结果中,规定 [1000 0000]就是-128,实际上是使用以前的-0的补码来表示-128,所以-128并没有原码和反码表示

  • 因此补码表示范围

[1000 0000, 0111 1111]

十进制值为

[-128, 127]

例如:Java中基本数据类型int为4个字节,32位,可表示的范围:[-231, -231 - 1]

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Sunshine