本文的内容通下面这篇文章有着紧密的联系,读者可以选择性阅读 

C语言————二、八、十、十六进制的相互转换-CSDN博客

目录

基本概念

原码 反码 补码 转换

数据的存储方式

基本存储单位

数据的计算方式

补码的模运算原理 

移位操作符

左移操作符

右移操作符

位操作符:&、|、^、~

&的运算规则

|的运算规则

^的运算规则

~的运算规则


基本概念

我们知道不同进制的数字,归根结底都是一个个不同的表现形式 。

原码、补码和反码是整数类型在计算机内部以二进制存储时的三种不同表现形式,虽然整数具有这三种类型的存储方式,但是在内存中以补码的形式进行存储。

有符号整数在这三种方法中均由符号位数值位两部分组成,在二进制序列中,最高的一位被视为符号位,其余都是数值位。

下面我们对这三种方式进行逐一介绍:

原码:直接将数字按照二进制转换方法得到的就是原码

反码:符号位不变,其余位依次取反得到的就是反码

补码:反码+1得到的就是补码

:知道一个负整数的补码或者反码,想求这个负整数的值,那么应该将补码或者反码逆推回去得到原码,再由原码进行计算得到的值才是正确的,在计算中,符号位不参与权重,仅用以判断正负。

正整数的原码、反码、补码都相同;

原码 反码 补码 转换

负整数的原码、反码、补码有如下的转换形式(转换中符号位不变):

在对这三种形式运用的深入之前,我们先进行一个前置的知识储备。 

数据的存储方式

我们知道,计算机内部采用二进制存储所有数据,原因是电子元件(如晶体管)的 “导通” 与 “截止” 两种状态可直接对应二进制的 “1” 和 “0”,物理实现简单且稳定。

基本存储单位

我们知道一个int的字节大小为4,那么他的二进制位数为32位,接下来我们会用int来介绍三种码之间的运用方式。

数据的计算方式

在计算机中,数据的计算和存储都是通过补码来完成的。这是因为使用补码可以对符号位和数值域进行统一的处理,同时加减法也可以进行统一处理(CPU处理器只有加法器),此外,原码和补码的相互转换,二者的方式是相同的,也不需要额外的电子元件。

那为什么使用补码而不是原码呢?

原码是利用最高位表示符号(0 代表正数,1 代表负数),其余位表示数值的绝对值。不过,原码在进行加减法运算时会碰到一些难题:

  • 符号位处理复杂:在进行加减法运算时,需要先判断操作数的符号,然后再决定是进行加法还是减法运算。
  • 存在正负零:原码中存在两种零的表示方式,即+0(0000)和-0(1000),这会使比较操作变得复杂。
  • 减法运算困难:当进行减法运算时,需要设计专门的电路来执行减法操作,这增加了硬件的复杂度。

补码是通过对原码取反后加 1 得到的,它成功解决了原码存在的上述问题。

  • 统一加减法运算:在补码系统中,减法可以转换为加法来进行计算,比如A - B可以表示为A + (-B)。这样一来,计算机就不需要设计专门的减法电路,只需一个加法器就能完成加减法运算。
  • 消除正负零:在补码表示中,零只有一种表示形式,即0000。而1000则被用来表示-8,这使得数值的表示范围得到了扩展。(+0和-0的补码结果时一致的,所以只有一种表示形式
  • 简化硬件设计:由于加减法运算可以统一用加法器来实现,硬件设计变得更加简单,同时还能减少出错的概率。
    int main()
    {//1 - 1//1 + (-1)//00000000000000000000000000000001 ---- 1的原码//00000000000000000000000000000001 ---- 1的补码//00000000000000000000000000000001 ---- 1的反码//10000000000000000000000000000001 ---- -1的原码//11111111111111111111111111111110 ---- -1的反码//11111111111111111111111111111111 ---- -1的补码//那么我们用原码进行计算时我们可以得到值为10000000000000000000000000000010  即-2,与结果不符//我们使用补码进行计算时可以得到00000000000000000000000000000000    即0,数值相符return 0;
    }

    通过上述代码,我们发现,使用原码进行计算时(相当于没有考虑正负符号直接求和),得到的结果与值不符,而补码计算时完美的弥补了他的不足。

补码的模运算原理 

补码其实是一种模运算系统。对于 n 位二进制数,其模为 2ⁿ。例如,4 位二进制数的模就是 16。在模运算中,减去一个数就相当于加上这个数的补数,即x - y ≡ x + (2ⁿ - y) (mod 2ⁿ)

以 4 位二进制数计算5 - 3为例:

  • 可以转化为5 + (-3)

  • -3的补码为1101(也就是16 - 3 = 13

  • 计算5 + 13 = 18,由于模为 16,18 mod 16 = 2,结果正确。

另,整数值和其补码对应的值由如下对应关系:

  • 正数:直接表示为二进制,范围是 0 到 2^(n-1)-1

  • 负数-N 表示为 2^n - N,范围是 -2^(n-1) 到 -1

    例如,4 位补码的模是 16

  • -5 表示为 16 - 5 = 11(二进制 1011)。{取反+1得到1101即-5}

  • -8 表示为 16 - 8 = 8(二进制 1000)。{取反+1得到0000,这是错误的示范,8在4位二进制无法用原码表示,进一步体现了原码的局限性}

移位操作符

<< 为左移位操作符

>> 为右移位操作符

:他们的操作数都只能是整数,有且仅有两个操作数,只能移动非负数位

左移操作符

移动规则:左边抛弃,右边补0

对于 10 << 1 ,他的具体变化如下:

#include <stdio.h>
int main()
{int num = 10;int n = num<<1;printf("n= %d\n", n);//变成20printf("num= %d\n", num);//num不变,即不改变num自身的值return 0;
}

右移操作符

右移操作符具有两种不同的移动规则:

1.算术右移:左边用原该值的符号位填充,右边丢弃

2.逻辑右移:左边用0填充,右边丢弃

对于-10 >> 1,采用算术右移变化如下:

对于-10 >> 1,采用逻辑右移变化如下:

#include <stdio.h>
int main()
{int num = -10;int n = num>>1;printf("n= %d\n", n);//变成-5printf("num= %d\n", num);//num不变,即不改变num自身的值return 0;
}

在实际运算中,>>右移操作符采用算术右移还是逻辑右移,取决于编辑器规则;但一般情况下采用的是算术右移。 

位操作符:&、|、^、~

位操作符有: 

& ———— 按位与
 ———— 按位或
^ ———— 按位异或
~ ———— 按位取反
:他们的操作数必须是整数
&的运算规则
以两个整数的补码进行计算,对应的二进制位上,有0就为0同时为1才为1
|的运算规则

以两个整数的补码进行计算,对应的二进制位上,有1就为1同时为0才为0

^的运算规则

以两个整数的补码进行计算,对应的二进制位上,相同为0相异为1

~的运算规则

根据取反的规则,对整数的补码进行取反运算

———————————————————————————————————————————

后续会更新针对于二进制数的相关操作符

有表述不当的地方辛苦大家指出,三克油。

打怪升级中................................................................................................................................................

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

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

相关文章

函数-变量的作用域和生命周期

变量的作用域 引入问题 我们在函数设计的过程中&#xff0c;经常要考虑对于参数的设计&#xff0c;换句话说&#xff0c;我们需要考虑函数需要几个参数&#xff0c;需要什么类型的参数&#xff0c;但我们并没有考虑函数是否需要提供参数&#xff0c;如果说函数可以访问到已定义…

Ansible在配置管理中的应用

Ansible是一个开源的配置管理和应用程序部署工具&#xff0c;它使用YAML语言编写的Playbook来描述配置和应用部署过程。通过SSH协议与目标机器通信&#xff0c;Ansible可以实现批量操作&#xff0c;极大地提升了工作效率。核心功能Ansible的核心功能包括&#xff1a;配置管理&a…

【学习路线】Go语言云原生开发之路:从简洁语法到微服务架构

一、Go语言基础入门&#xff08;1-2个月&#xff09; &#xff08;一&#xff09;环境搭建与工具链Go环境安装 官方安装&#xff1a;从golang.org下载安装包版本管理&#xff1a;g、gvm等Go版本管理工具环境变量&#xff1a;GOROOT、GOPATH、GOPROXY配置Go Modules&#xff1a;…

软件工厂:推动新质生产力的组织跃迁

引言&#xff1a;软件工厂的建设&#xff0c;不在于工具多&#xff0c;而在于理解深&#xff1b;不在于上线快&#xff0c;而在于体系稳。不仅是“看得见的流水线”&#xff0c;更是“看不见的组织变革”。在新质生产力的时代命题下&#xff0c;软件工厂正成为连接创新与效率、…

9.0% 年增速驱动!全球自清洁滚轮拖布机器人市场2031年将迈向 946 百万美元

自清洁滚轮拖布机器人是重要的智能清洁设备&#xff0c;采用滚筒式拖布结构&#xff0c;集扫拖功能&#xff0c;通过高速旋转加压擦洗地面&#xff0c;深度除污。其活水清洁系统可实时自清洁、回收污水&#xff0c;避免二次污染&#xff0c;提升清洁效率与效果&#xff0c;带来…

新能源工厂的可视化碳中和实验:碳足迹追踪看板与能源调度策略仿真

摘要新能源工厂明明用着风电、光伏等清洁能源&#xff0c;碳排放数据却依旧居高不下&#xff1f;某锂电池厂耗费百万升级设备&#xff0c;碳足迹却难以精准追踪&#xff0c;能源调度全靠经验“拍脑袋”&#xff0c;导致成本飙升。而隔壁企业通过可视化碳中和实验&#xff0c;碳…

数据结构自学Day13 -- 快速排序--“非递归利用栈实现”

一、快速排序回顾 快速排序本质上是**“分而治之”&#xff08;Divide and Conquer&#xff09;策略的递归应用。但递归其实就是函数栈的一种体现&#xff0c;因此我们也可以显式使用栈&#xff08;stack&#xff09;来模拟递归过程**&#xff0c;从而实现非递归版本的快速排序…

前端数据库:IndexedDB 基础使用

前言 在现代 Web 开发中&#xff0c;随着应用程序复杂度的增加&#xff0c;对本地存储的需求也越来越高。虽然 localStorage 和 sessionStorage 可以满足一些简单的数据存储需求&#xff0c;但当需要存储大量结构化数据或进行复杂查询时&#xff0c;它们就显得力不从心了。这时…

Kubernetes深度解析:企业级容器编排平台的核心实践

引言&#xff1a;Kubernetes的战略地位与核心价值在云原生技术生态中&#xff0c;​​Kubernetes​​已成为容器编排的事实标准。根据2023年全球云原生调查报告&#xff1a;全球​​96%​​ 的组织正在使用或评估Kubernetes企业生产环境Kubernetes采用率增长​​400%​​&#…

Netty中future和promise用法和区别

定义与概念 Future&#xff1a;表示一个异步操作的结果。它是只读的&#xff0c;意味着你只能查看操作是否完成、是否成功、获取结果或者异常等信息&#xff0c;但不能主动设置操作的结果。Promise&#xff1a;是 Future 的可写扩展。它不仅可以像 Future 一样查看操作结果&…

微算法科技(NASDAQ:MLGO)采用分布式哈希表优化区块链索引结构,提高区块链检索效率

随着区块链技术的快速发展&#xff0c;其在各个领域的应用越来越广泛。然而&#xff0c;区块链数据的存储和检索效率问题一直是制约其发展的瓶颈之一。为了解决这一问题&#xff0c;微算法科技(NASDAQ&#xff1a;MLGO)采用了分布式哈希表&#xff08;DHT&#xff09;技术来优化…

Jmeter的元件使用介绍:(三)配置元件详解01

Jmeter的配置元件有非常多&#xff0c;常用的有&#xff1a;信息头管理器、Cookie管理器、用户定义的变量、Http请求默认值、JDBC Connection Configuration、CSV 数据文件设置、计数器等&#xff0c;本文会对这些常用的配置元件一一介绍&#xff0c;还有其他很多配置元件&…

git 连接GitHub仓库

一、安装 git 包在官网下载 git 包二、通过SSH密钥与GitHub远程仓库连接1. 检查本地 SSH 密钥是否存在ls -al ~/.ssh如果看到 id_rsa 和 id_rsa.pub&#xff0c;说明已有密钥。2.如果没有&#xff0c;生成新的 SSH 密钥&#xff1a;ssh-keygen -t ed25519 -C "your_email…

如何通过AI扫描代码中的问题

代码质量其实在需求高压&#xff0c;业务快速迭代的场景下往往容易被人忽视的问题&#xff0c;大家的编码习惯和规范也经常会各有喜好&#xff0c;短期之内获取看不出来什么问题&#xff0c;但长此以往就会发现&#xff0c;屎山逐步成型了&#xff0c;而线上代码跑着往往就不想…

Java 大视界 -- Java 大数据机器学习模型在金融衍生品市场波动特征挖掘与交易策略创新中的应用(363)

Java 大视界 -- Java 大数据机器学习模型在金融衍生品市场波动特征挖掘与交易策略创新中的应用&#xff08;363&#xff09;引言&#xff1a;正文&#xff1a;一、Java 构建的金融数据处理架构1.1 多源异构数据实时融合1.2 新闻舆情与市场冲击建模二、Java 驱动的波动特征挖掘与…

Cartographer安装测试与模块开发(三)--Cartographer在Gazebo仿真环境下的建图以及建图与定位阶段问题(实车也可参考)

参数介绍之所以要首先介绍参数而不是实操&#xff0c;是因为大部分建图失败、漂移基本上都是参数设置错误引起的&#xff0c;或者说大部分都是TF存在问题&#xff0c;主要是坐标系Frame之间有冲突或者对不上等原因导致的&#xff0c;因此把参数放在前面介绍&#xff0c;了解了参…

uniapp nvue开发App 横竖屏切换丢失上下文导致 setTimeout和clearTimeout报错

报错内容如下 [JS Framework] Failed to find taskCenter (35). [JS Framework] Failed to execute the callback function:TypeError: c.clearTimeout is not a function reportJSException >>>> exception function:__WEEX_CALL_JAVASCRIPT__, exception:JavaSc…

Mirauge3D 赋能:全自动建模,让城市规划与建筑设计拥有高分辨率实景三维模型

在数字化浪潮席卷各行各业的当下&#xff0c;高精度、多元化的空间数据已成为基础测绘、智慧城市建设、自然资源管理等领域高质量发展的核心支撑。从城市交通网络的智能规划到国土空间的优化配置&#xff0c;从灾害监测的精准预警到生态环境保护的科学决策&#xff0c;空间数据…

Javaweb————学习javaweb的预备知识

❤️❤️❤️一.javase,javaweb,javaee的区别和联系 &#x1f499;&#x1f499;&#x1f499;javase: 通俗的来讲就是java技术栈&#xff0c;做java相关开发的基础&#xff0c;比如javaweb&#xff0c;javaee开发都是必备javase的基础的&#xff0c;包括java语言基础&#xff…

zabbix服务自动发现、自动注册及配置钉钉告警(小白的“升级打怪”成长之路)

目录 一、自动发现及自动注册 1、自动发现 2、自动注册规则 二、监控告警并发送电子邮件 1、设定发邮件的地址 2、设定发邮件的用户 3、设定监控及触发的条件 4、开始告警并设置触发发邮件 三、钉钉告警 1、配置zabbix-server 2、配置监控及触发 3、web页面操作 4、…