深入理解原码、反码、补码(结合C语言)

一、引出问题

在学习C语言单目操作符中~按位取反的过程中,对这样一段代码的结果产生了疑惑:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>int main() {int a = 0;int b = ~a;·//按位取反printf("%d\n", b);return 0;
}输出结果:
-1

首先,int整型占4个字节,0化为二进制形式为00000000 00000000 00000000 00000000这样,按位取反后是11111111 11111111 11111111 11111111,化为十进制不应该是一个很大的负数吗,而输出结果却为-1。

之后我查阅资料才发现,我忘记了负数在计算机内存中是以补码的方式存储和进行运算的。于是我又将原码、反码、补码相关的知识复习了一遍,温故而知新,重新总结如下。

二、深入理解原码、反码、补码

在计算机中,数字的二进制位的第一位是符号位,0为正,1为负

首先要明白,原码、反码、补码是计算机用于表示带符号整数的三种编码方式

  1. 原码:原码最高位为符号位,其余位为数值绝对值的二进制值,如5的原码是0000 0101,-5的原码是1000 0110。原码表示最直观,但在进行加减法运算时存在问题,如5+(-5)理论上等于0,但原码相加得1000 1011并不是0000 0000
  2. 反码:正数的反码与原码相同,负数的反码是将原码符号位不变,其余位按位取反。如5的反码即原码0000 0101,-5的反码为1111 1010。
    引入反码是为了更好的解决二进制正数与负数间的加减法问题,如5+(-6)即0000 0101 + 1111 1001 = 1111 1110(反码),转为原码即符号位不变,其余位取反,得1000 0001,正好是-1。
    但反码仍然存在溢出和零的表示问题,如-5+6,即1111 1010 + 0000 0110 => 溢出得0;-5+5即1111 1010 + 0000 0101 = 1111 1111(反码),转为原码即1000 0000,这就与0000 0000的0的原码表示方式存在冲突,一个数总不能有两种表示方法吧。于是就有了下面的补码。
  3. 补码:正数的补码与原码相同,负数的补码是将负数的原码符号位不变,其余位取反后再加1(即负数的反码+1)。如5的补码即原码0000 0101,-5的补码为1111 1011。
    补码的引用很好的解决了加减法和0的表示问题,还能够自然地处理溢出,下面验证一下:
    • -6+5,即1111 1010 + 0000 0101 = 1111 1111,转为原码(补码-1,符号位不变,其余位取反)得1000 0001,即-1,没毛病。
    • -5+6,即1111 1011 + 0000 0110 => 溢出且得0000 0001,正数,即原码本身,得1,没毛病。
    • -5+5,即1111 1011 + 0000 0101 => 溢出且得0000 0000,与0的原码表示相同,没毛病。
      由此可见,在计算机中,补码是最常见和最有效的带符号整数表示方式。
      因此,在计算机中,带符号的整数在内存中存储的是其二进制的补码

那么这就可以理解结果为什么为-1而不是一个很大很大的负数,以上代码的计算过程如下:

//a=0的补码(也是原码)
00000000 00000000 00000000 00000000
//~取反运算得到b的补码
11111111 11111111 11111111 11111111
//补码-1
11111111 11111111 11111111 11111110
//符号位不变,按位取反得到原码
10000000 00000000 00000000 00000001

即得到打印出来的结果为-1

终于,破案了~

三、关于原码、反码、补码之间的转换

1.对于正数,原码 = 反码 = 补码
2.对于负数,此图足以:
请添加图片描述

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

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

相关文章

【MySQL】视图 + 用户管理

视图 前言正式开始视图用户管理user表创建新用户修改用户密码权限管理给用户赋权剥夺权限 前言 本篇所讲的视图和我上一篇事务中所讲的读视图不是一个东西&#xff0c;二者没有任何关系&#xff0c;如果看过我前一篇博客的同学不要搞混了。 其实视图和用户管理本来是想着分开…

大数据Doris(三十二):Doris高级功能

文章目录 Doris高级功能 一、​​​​​​​表结构变更

VMware Workstation Pro 17及 Windows 11 虚拟机的安装与激活

六点钟&#xff1a; 吃晚饭吗 不吃&#xff0c;胖胖 十点钟&#xff1a; 阿昊要吃夜宵对不对 ——CSDN&#xff0c;记录牛马生活 本文是在学习 Linux 期间&#xff0c;使用 VMware 时顺带学习 Windows 11 虚拟机的安装与激活 VMware Workstation Pro 17及 Windows 11 虚拟机…

Java Throwable

如图展示了 Java 整个异常体系的关系。 Throwable 的 Java 异常体系的基类, 他的直接子类有 Error 和 Exception 2 个。 1 Error Error 表示的是由于系统错误, Java 虚拟机抛出的异常, 例如 Java 虚拟机崩溃, 内存不够等, 这种情况仅凭程序自身是无法处理的, 在程序中也不会…

004、简单页面-基础组件

之——基础组件 目录 之——基础组件 杂谈 正文 1.Image 1.0 数据源 1.1 缩放 1.2 大小 1.3 网络图片 2.Text 2.0 数据源 2.1 大小 2.2 粗细 2.3 颜色 2.5 样式字体 2.6 基础示例 2.7 对齐 2.8 省略 2.9 划线 3.TextInput 3.1 输入类型 3.2 提示文…

量子测量-技术点杂录

目录: 高质量文章导航-持续更新中_GZVIMMY的博客-CSDN博客 前置:量子测量设备 电子显微镜:电子显微镜可以在非常高分辨率下观察生物组织、细胞和分子结构。通过调整电子束的强度和聚焦来观察细胞内部的微小结构。但是,电子显微镜需要对样品进行切片处理,而且在真空中进行…

HbuilderX 项目打包文件过大问题优化

文章目录 HbuilderX 项目打包文件过大问题优化主要操作收效甚微&#xff0c;但又有那么点用的方法使用 gulp 压缩&#xff08;最后一步&#xff09;使用与配置 网上找的 gulp 优化压缩配置还未尝试可能有用的方法 尝试过程中看到的一些优质文章 HbuilderX 项目打包文件过大问题…

Shell循环:for(三)

示例&#xff1a;使用for实现批量主机root密码的修改 一、前提 已完成密钥登录配置&#xff08;ssh-keygen&#xff09;定义主机地址列表并了解远程修改密码的方法 [rootlocalhost ~]# ssh-keygen #设置免密登录[rootlocalhost ~]# ssh-copy-id 192.168.151.151 二、演示…

科研学习|论文解读——Open government research over a decade: A systematic review

Open government research over a decade: A systematic review 十年来的开放政府研究&#xff1a;一个系统性综述 摘要 在过去十年中&#xff0c;对开放政府的学术研究蓬勃发展。然而&#xff0c;对开放政府的全面审查是有限的。这一研究空白不仅阻碍了我们对开放政府整体知…

mysql区分大小写吗

mysql在windows下默认是不区分大小写的&#xff0c;在linux下默认是区分大小写的。 所以&#xff0c;为了避免出问题&#xff0c;许多公司的数据库编程规范中明确规定&#xff1a;库名、表名、列名、索引名一律小写&#xff0c;不同单词之间以下划线分割&#xff0c;且控制在3…

重庆市失业金申领流程

1.领失业金的前提&#xff1a;非本人意愿中断就业。个人理解就是不是主动辞职才能领。 2.因此公司在处理社保减员的时候&#xff0c;不能是劳动者主动提出离职。 3.社保减员可选择原因&#xff1a;其他原因中断缴费 / 由单位提出双方协商一致解除劳动合同。 4.当社保暂停缴费…

算法——滑动窗口

滑动窗口大致分为两类&#xff1a;一类是窗口长度固定的&#xff0c;即left和right可以一起移动&#xff1b;另一种是窗口的长度变化&#xff08;例如前五道题&#xff09;&#xff0c;即right疯狂移动&#xff0c;left没怎么动&#xff0c;这类题需要观察单调性(即指针)等各方…

以下哪项不是在内蒙古举办的?()

需要查看更多试题和答案&#xff0c;可以前往题海舟&#xff08;题海舟&#xff09;进行搜题查看。可以搜“题干关键词”。 以下哪项不是在内蒙古举办的&#xff1f;&#xff08;&#xff09; A.中蒙博览会 B.东北亚区域合作高峰论坛 C.中蒙俄合作高层论坛 D.中日经济合作会 …

C++基础 -32- 逻辑运算符重载

逻辑运算符重载格式 bool operator&&(data1&a,data2&b) {if(a.a&&b.a){return true;}elsereturn false; }举例使用单目运算符重载 #include "iostream"using namespace std;class data1 {public :int a;data1(int a):a(a){} };class d…

(数据结构)顺序表的查找

静态分配代码&#xff1a; #include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struct LinkList {int data[MAX];int lenth; }Link; //初始化 void CreateList(Link* L) {L->lenth 0;for (int i 0; i < MAX; i){L->data[i] 0;} } //插入 …

策略模式与简单工厂模式:终结if-else混乱,让代码更清爽

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概4500多字&#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…

计算机网络扫盲(2)——网络边缘

一、概述 在计算机网络得到术语中&#xff0c;我们把与因特网相连的计算机或其他设备称为端系统&#xff08;或者主机&#xff09;&#xff0c;如下图所示&#xff0c;因为它们位于因特网的边缘&#xff0c;所以被称为端系统。因特网的端系统包括了桌面计算机&#xff…

Hdoop学习笔记(HDP)-Part.09 安装OpenLDAP

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

蓝桥杯day03——Bigram 分词

1.题目 给出第一个词 first 和第二个词 second&#xff0c;考虑在某些文本 text 中可能以 "first second third" 形式出现的情况&#xff0c;其中 second 紧随 first 出现&#xff0c;third 紧随 second 出现。 对于每种这样的情况&#xff0c;将第三个词 "th…

Android布局控件之LinearLayout、RelativeLayout、GridLayout、ScrollView

线性布局&#xff08;LinearLayout&#xff09; orientation horizontal:水平从左往右vertical:垂直从上到下若不指定orientation属性&#xff0c;默认为水平 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http:…