计算机补码存储

news/2024/11/16 7:54:37/文章来源:https://www.cnblogs.com/madadam/p/18352396

以下过程用8位的有符号char表示数据。

1. 计算机为什么用补码存储整数

  • 加法运行

计算机是按照二进制存储的,并且计算机只会做加法,不会减法。

 首先看下加法,例如1+1=20000 00010000 0001 ——————————0000 0010如果是1-1呢,因为计算机不会减法,会转换为1+(-1)。这就涉及到-1怎么表示了?如果用1000 0001表示-1进行如下计算0000 00011000 0001—————————1000 0010    这个结果就表示-2,正确结果应该是0,说明这种表示方式不行。
  • 引入补码

针对该问题,计算机的前辈们想到用补码的形式表示整数(内存中存储也是存的补码),正数的补码和原码一样,负数的补码的非符号位取反后加1。

 按照这个规则,-1用补码表示为1000 0001(原码)——非符号为取反——>1111 1110——加1——>1111 1111.所以1+(-1)的计算过程如下:0000 00011111 1111——————————10000 0000     这个结果表示0,正确。

2.-128怎么表示

大家都知道char的取值范围是-128~127,但是-128怎么表示呢?我们按照上面的补码规则推算一下:

 1 1000 0000(用9位表示的原码)——非符号位取反——>1 0111 1111——加1——>1 1000 0000(补码)由上可知,原码 1 1000 0000对应的补码还是自身。截断溢出的最高位后是1000 0000。
如果只8位的1000 0000,有人可能会认为是表示-0,实际是已经用0000 0000表示0了,1000 0000再表示0就重复了,那就约定表示-128,而且这样表示不会引入错误(至于之前的大佬怎么想出来的,我暂时还不清楚),例如-128+64,计算过程如下:1000 00000100 0000—————————1100 0000 (补码形式)——减1——>1011 1111——非符号位取反——>1100 0000(原码形式,表示-64)

3.在Linux环境下,如何用gdb查看某个变量在内存中是按照补码形式存储的呢

Image Name

如上图所示:
先用命令 p 查看变量val的内存地址,为0xffff1423.
再用命令 x 查看内存存储情况
x /4xb 0xffff1423
4:表示查看4个字节的内存.
x:表示内存数据显示的格式,和C语言中的printf保持一致.
b:表示内存单位大小 ,b:1个字节,h:Halfwords(2个字节),w:Words(4个字节).
如上图,变量val在内存中存储为"ff ff ff f6" 确实是-10的补码形式.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/780919.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bean初始化生命周期

每天坚持,终会抵达!

2.g++分步编译演示从源码到执行程序的四步

2.g++分步编译演示从源码到执行程序的四步 2.1 gcc的工作流程 gcc编译器将c源文件到生成一个可执行程序,中间一共经历了四个步骤:四个步骤并不是gcc独立完成的,而是在内部调用了其他工具,从而完成了整个工作流程,其中编译最耗时,因为要逐行检查语法。gcc的工作流程: 1.预…

3.makefile运行流程分析并使用变量改写项目

3.makefile运行流程分析并使用变量改写项目GNU make用来构建和管理自己的工程 Makefile 文件描述了整个工程的编译、连接等规则3.1makefile变量的使用命令格式 含义CXX C++编译器的名称,默认值为g++CXXFLAGS C++编译器的选项,无默认值$* 不包含扩展名的目标文件名称$+ 所有的…

Epson L4168 固件升级

我的Epson L4168打印机提示固件升级,我手贱就点了OK。过一会再来看,发现打印机直接黑屏 显示EPSON PRINTER Recovery Mode,一看就知道升级失败变砖了。按任何键都没有反应。中文官网上没有这款打印机的recovery mode修复帮助。我就搜索一下其它国家的官网上发现L4168在北美地…

costmap代价地图

1 什么是costmap代价地图在机器人进行路径规划时,我们需要明白规划算法是依靠什么在地图上来计算出来一条路径的。依靠的是gmapping扫描构建的一张环境全局地图,但是仅仅依靠一张原始的全局地图是不行的。因为这张地图是静态的,无法随时来更新地图上的障碍物信息。在现实环境…

店铺点评_1_短信登录功能

1 短信登录 1.1 导入点评项目框架 1. 当前模型简述手机/app端发起请求,请求nginx服务器。(nginx基于七层模型走HTTP协议,可以实现基于Lua直接绕开tomcat访问redis;也可以作为静态资源服务器,实现上万并发,负责均衡到下游tomcat服务器,打散流量。一台4核8G的tomcat,在优…

sql优化小tips

sql优化小tips基础sql优化1、避免使用select * 尽量要什么字段查什么字段, select * 多查出来的数据在网络上IO传输的过程中,会增加数据传输的是的时间。且 select *不会走覆盖索引,会出现大量的回表操作,而从导致查询sql的性能很低。 ​ 覆盖索引(Covering Index): 覆盖…

一些面试小tips

反射 它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。 反射可以让代码更加灵活、(为各种框架提供开箱即用的功能提供了便利),一般我们写业务代码接触到直接使用反射机制的场景不多,但是在…

暑假集训CSP提高模拟17

暑假集训CSP提高模拟17 组题人: @joke3579\(T1\) P222. 符号化方法初探 \(70pts\)原题: [ABC081D] Non-decreasing部分分测试点 \(1\) :输出样例 \(1\) 。 测试点 \(11 \sim 15\) :由于 \(\{ a \}\) 非负,所以对 \(\{ a \}\) 作前缀和即可。 随机 \(pts\) :乱搞。正解当 …

一款.NET开发的AI无损放大工具

前言 今天大姚给大家分享一款由.NET开源(GPL-3.0 license)、基于腾讯ARC Lab提供的Real-ESRGAN模型开发的AI无损放大工具:AI-Lossless-Zoomer。Real-ESRGAN模型专注于人像和动漫图片的高质量无损放大。项目功能 支持多线程处理、批量图片处理、设置选项、自定义输出格式和自…

Java知识点1

Java知识点 什么是字节码?采用字节码的好处是什么? 在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。字节码…

Python-快速语法参考-全-

Python 快速语法参考(全)原文:The Python Quick Syntax Reference 协议:CC BY-NC-SA 4.0零、简介 Python 提供的最好的东西之一是一个广泛的标准库,它提供了广泛的包含特性,从网络功能、数据库处理和 XML 处理一直到 zip 文件处理。有数百个额外的库扩展了 Python 的能力…