补码、无符号数减法运算

1. 补码

Two's Complement(二补数、补码)是对二进制数的数学运算,运算过程为:对二进制序列每一位取反(0->1; 1->0),再加1。

bits取反补码
011100101
010101110
111000001

2. 计算机中有符号数的表示

计算机中的数值类型分为整数型和浮点数型,有符号数在最高位设置符号位,其余低位均为数值位。数值位一律采用补码形式存储,并参与计算。采用补码的形式表示有符号数至少有两大好处。

  • 符号位和数值位统一参与运算,不用区分正、负,加法和减法实现简单;
  • 数据的原码和补码之间的相互转换不需要依赖额外硬件电路。

下面分别介绍有符号数的表示方法

2.1 整数

正整数

正整数的补码是其二进制表示,与原码相同。
例如,在整数类型占用4字节(32位)的系统中,+5的补码是00000000 00000000 00000000 00000101。最高位0表示该数值为正数,其余31位表示数值大小。

负整数

负整数的补码需要对其绝对值的二进制表示进行补码运算。
例如,-5的补码是11111111 11111111 11111111 11111011。最高位为1,表示该数值为负数,其余31位表示数值大小。

在进行运算时,CPU并不会区分是正数还是负数,而是直接进行计算,这正是前面介绍的符号位和数值位的统一。
例如,a=10, b=-5,则a+b的运算过程如下:

  00000000 00000000 00000000 00001010 (10)
+ 11111111 11111111 11111111 11111011 (-5)
===========================================00000000 00000000 00000000 00000101 (5)

如果,a=1, b=5,则a-b首先转换成加法a+(-b),再进行计算,过程如下:

a-b ==> a+(-b)00000000 00000000 00000000 00000001 (1)
+ 11111111 11111111 11111111 11110110 (-10)
===========================================11111111 11111111 11111111 11110111 (-9)   

对于正整数(最高位为1),将非符号位的二进制位直接转换成十进制,就表示该正数的实际大小。如果一个数是负整数,如何将其补码转换成十进制大小呢?补码运算即可。
例如上面的11111111 11111111 11111111 11110111,最高位符号位是1,所以该数为负数,补码运算之后为00000000 00000000 00000000 00001001,大小为9,所以表示-9

2.2 浮点数

pass

3. 为什么是补码?

为什么两个数相减a-b用补码形式a+(-b)进行计算的结果是正确的?不妨看一下对b进行补码的过程绝对值的二进制序列取反,再加1。取反在计算机的逻辑电路中就是开关的闭合状态取反即可,即1->0,0->1。如果用数学算式表达的话,对一个bit位b的取反运算可以写成

取反b = 1-b (*)
b=0时,取反b为1,1-b=1;
b=1时,取反b为0,1-b=0;
所以算是(*)可以表达取反运算

综上,a-b的计算过程可表达为(8bit为例)

a-b == a+(-b) == a+(11111111-b+1) == a+(b的补码形式)
在8bit系统中,11111111 + 1 == 00000000,溢出。
所以,a+(11111111-b+1) = a+(0-b) = a - b

可以看出,补码运算的实现效果巧妙地利用了因计算机系统位数限制而产生的溢出现象。

4. 一个C++面试题

下面代码打印多少?

#include <iostream>

int main(int argc, char **argv)
{
std::cout << 25u - 50;
return 0;
}

答案是4294967271

25uunsigned int类型,50为int类型。在这两种操作数进行-运算时,int被提升为unsigned int型,运算变为25u - 50u,结果也应该是unsigned int类型。经过对-50u进行补码运算后带入加法运算,-25的二进制表示形式被存入内存,即11111111 11111111 11111111 11100111(int为32位),在打印时按无符号数处理,则直接转换成十进制正整数为4294967271

11111111 11111111 11111111 11100111 =
2^31 + 2^30 + ... + 2^5 + 2^2 + 2^1 + 2^0 =
2^5(1-2^27) / (1-2) + 7 =
4294967271

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

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

相关文章

改变自己.

今天莫名其妙的被人躺枪了,悲催!

北京80后整体亮相《北京作家》

北京80后出生作家专号目录 郑小驴作品 枪声 秋天的杀戮 祁又一作品嗨&#xff01;朱迪生活在1968 关于阿玉姐姐的性尺度问题鲍尔金娜作品门 南锣鼓巷漫记 霍艳作品北海道的小村姑 北京大妞在香港 董夏青青作品 何日君再来 春树作品恶心 彭 扬作品幽灵 毕建伟作品论读书…

postman 发送到onenet,chinanet

http://api.heclouds.com/nbiot/offline?imei869405035099366&obj_id3339&obj_inst_id0&expired_time2019-09-04T13:00:00&trigger_msg4&mode2

浮点数(小数)的表示方法

浮点数(小数)的表示方法 浮点数可以在更大的动态范围内提供更高的分辨率。当定点数由于受到精度和动态范围所限不能精确表示数值时,浮点数能提供更好的解决方法。 标准的浮点数字长由符号位s(1bit)、指数e和无符号(小数)的规格化尾数m构成,其格式如下: s指数e无符号…

Cloudstreams: 云间整合的下一个挑战

Benoit Lheureux在其博文中写道&#xff0c;云计算不仅仅是\u0026#xD;\n……激增且混乱的云服务、创新、混搭和云资源的消费……\u0026#xD;\n在他看来&#xff1a;\u0026#xD;\n云服务消费对于业务来说仍然非常技术化&#xff0c;其中存在大量管理和合规问题。到最后&#xff0c…

Java解释XML文件的小例子

<?xml version"1.0" encoding"GBK"?> <addresslist><name>hemmingway</name> </addresslist>上面是test.xml文件, 下面是DOMDemo.java文件 package org.lxh.xml.dom;import java.io.File; import java.io.IOException; im…

鲁迅文学院60周年庆

鲁迅文学院走过60年的历程。这是在鲁迅文学院新址召开的庆典。 这次60周年庆典&#xff0c;邀请了曾在鲁迅文学院上学的历届学员代表参加。这是我们鲁九的三位同学&#xff1a;北京的倪学礼、新疆的张好好、河北的司敬雪。 鲁迅文学院新址主楼大堂&#xff0c;宽阔明亮干净现代…

NB-IoT SNR RSRQ RSRP等信号参数解释

CELL ID 基站小区标识 CELL ID是网络中小区的编号&#xff0c;与MCC、MNC及LAC号组合成一个小区全球识别码&#xff0c;用来在全球范围内唯一识别某一小区。 EARFCN 中心频点 若一个区域的基站中心频点都相同&#xff0c;表示是同频部署。若一个区域的基站中心频点交叉分布&…

FPGA专有名词的积累

FPGA专有名词的积累 建立时间&#xff08;Tsu&#xff1a;set up time&#xff09;:是指在触发器的时钟信号上升沿到来以前&#xff0c;数据稳定不变的时间&#xff0c;如果建立时间不够&#xff0c;数据将不能在这个时钟上升沿被稳定的打入触发器&#xff0c;Tsu就是指这个最…

对身体的挣脱与自足的想象:谈阿满的小说集《双花祭》

阿满是个我不熟知的女作家&#xff0c;但读了她的几篇小说&#xff0c;我很惊讶。在我编辑和评论当代小说差不多25年的时间里&#xff0c;我阅读了无数的小说作品&#xff0c;也写了很多评论文章&#xff0c;可是让我惭愧的是&#xff0c;我忽略了这样一位出色的女作家&#xf…

老妈五十岁了

今天嗓子有些不舒服&#xff0c;老是想咳嗽的感觉。中午的时候吃饭回来&#xff0c;刚坐到电脑面前想随便看看新闻&#xff0c;接到小妹打来一个电话&#xff0c;原来老妈五十岁了&#xff0c;小妹也还是那个样子&#xff0c;说什么话都要调侃&#xff0c;永远都是乐观的&#…

J-LINK segger 驱动,MDK5.15版本,用于解决**JLink Warning: Mis-aligned memory write: Address: 0x20000000......

最近在使用nrf52832这款芯片&#xff0c;安装mdk后&#xff0c;又需要使用nrf go软件。安装nrf go &#xff0c;安装过程中&#xff0c;会提示覆盖已经安装的j-link驱动&#xff0c;如果覆盖了&#xff0c;就会出现标题中的错误。 解决办法&#xff0c;下载旧版本驱动&#xf…

“盛大文学”年终派对

北京尚都微薄之盐。盛大文学小说接龙双城记截稿答谢派对。美酒音乐歌曲文人美女。 狗子和丁天 吴虹飞和邱华栋。 龙东。 大仙和狗子。 于一爽和刘琴。 猜猜他是谁&#xff1f;猜对了有奖。 我与黎宛冰。

LM75温度测试

LM75温度测试 代码说明: temp_test.v 是顶层模块,包含了 i2c_read_lm75, hextobcd 和 smg_interface 模块; temp_test.v 是顶层模块,包含了 i2c_read_lm75, hextobcd 和 smg_interface 模块; hextobcd.v 为十六进制转 BCD 模块; uart_send.v 为温度数据串口发送模块, …

漂泊在汉语视界中的蒙古歌者

一 蒙古族是诗歌的民族&#xff0c;这句话你可以从纳赛音朝克图、布林贝赫、阿尔泰、宝音贺希格等为代表的无数蒙古族诗人中得到印证&#xff0c;也可以在蒙古民歌尤其是悠远苍劲的长调中得到体验&#xff0c;当然&#xff0c;如果你没有亲耳听到用纯正的蒙古语朗诵的诗歌&…

小demo, java swing窗口编程(JDK 1.6)

//这段代码主要是创建一个登录窗口界面&#xff0c;在这个界面中有文本组件、普通按钮组件、标签组件&#xff0c;它们是按照网格组布局管理方式布局&#xff0c; import javax.swing.*;import java.awt.*; import java.awt.event.*; ///这是一个登录类。设计成一个继承容器的类…

C语言中求和、计算平均值、方差和标准差

转载&#xff1a;https://blog.csdn.net/littlehero_121/article/details/98848871 计算C语言中的求和、标准差、方差和标准差等&#xff0c;需要加上头文件&#xff1a;#include <math.h> #include<stdio.h> #include "math.h"double sum 0;//求和do…

与铁生最后的聚会

史铁生 1951年1月4日——2010年12月31日 永在 我一直要活到我能够 坦然赴死&#xff0c;你能够坦然送我离开&#xff0c;此前 死与你我毫不相干。 此前&#xff0c;死不过是一个谣言 北风呼号&#xff0c;老树被 拦腰折断&#xff0c;是童话中的 情节&#xff0c;或永生的一个瞬…

AD学习笔记

AD学习笔记 创建一个网络&#xff1a;设计->网络表->编辑网络->添加->输入网络名->确定。添加网络&#xff1a;选中线->Panels(右下角)->PCB Inspector->Net 填网络名。或者双击线->出现Properties,在Net选择网络名。按空格键进行旋转。旋转的角度…

《城邦暴力团》:一部奇书、反书、隐书

这是一部不能轻易开口谈论的巨著&#xff0c;必须耐下心来仔细阅读&#xff0c;才能理解其中的奥妙、以及作者的良苦用心。香港作家倪匡说它是近十年仅见的“终生小说”&#xff0c;可以一生不停地反复阅读的好小说。我同意。这种小说一般的作家确实很难驾驭。他必须有深厚的历…