C语言中原码,反码,补码与移位操作符

       前言

        我们现在学习一下C语言中移位操作符的使用,与原码、补码、反码的概念与使用,在原码补码反码中,正整数三个都相同,负数的话我们在下面详细讲解。

        原码反码补码的概念:他们是整数的二进制表示的三种方式

        正整数

        在正整数中,原码反码补码都相同,我们只需要知道正整数的原码,那么它的反码和补码都是一样的,我们以7为例

        原码:00000000 00000000 00000000 00000111

        反码:00000000 00000000 00000000 00000111

        补码:00000000 00000000 00000000 00000111

        负数

        我们以-7为例(方便与上面对比)

        我们先写出它的原码:

        原码:10000000 00000000 00000000 00000111

        这里要注意啦,在原码反码补码中,第一位是符号位,它表示数字的正负,在原码反码补码中,不参与0-1之间的运算。

        反码:11111111 11111111 11111111 11111000

        负数的反码是在原码的基础上,符号位不变,其他位按位取反。

        补码:11111111 11111111 11111111 11111001

        负数的补码是在反码的基础上加上1。

        这些表示方法在计算机内部处理整数时尤为重要。尤其对于补码来说。

        移位操作符

        移位操作符分为左移操作符"<<"和右移操作符">>",它们两个在运算的过程中也是有所区别的。

        大家看到这里想必心中已经有所猜测,我们在学习移位操作符的时候为什么要先学习原码反码补码呢,它们之间是不是有什么联系,对的,你没有猜错。

        位移操作符移动的时候,移动的是内存中存放的二进制补码。 

        左移操作符<<

        还是以7为例

        00000000 00000000 00000000 00000111,我们将7<<1(7左移一位)得到

        00000000 00000000 00000000 00001110,左移操作符的运算规则是:左边丢弃,右边补0,在左移操作符位移之后,有*2的效果,比如我们将7左移一位之后得到十进制数为14,这是7的两倍。再左移一位之后得到:00000000 00000000 00000000 00011100,十进制值为28验证了我们的结论。

        我们来看看如果是负数怎么左移的,

        我们先计算出-7的补码:

        11111111 11111111 11111111 11111001

        之后我们对补码进行左移操作,在末位补0,左边丢弃,之后得到:

        11111111 11111111 11111111 11110010

        我们来看看结果是否正确,我们将操作后的补码返回为原码,首先将其变为反码(给末位减一)

        11111111 11111111 11111111 11110001

        之后将反码转换为原码:符号位不变,其他位按位取反

        10000000 00000000 00000000 00001110

        得到结果为-14,与我们预想结果一致,计算正确。

        但是还有一个情况,我们使用移位操作符时,不能对小数进行运算。不然会报错。

        右移操作符>>

        在右移操作符中,分为两种移位方式:算术移位与逻辑移位

        在算术移位中,移位规则是:右边丢弃,左边补原符号位。

        在逻辑移位中,移位规则是:右边丢弃,左边补0。

        还是以7为例,我们看看算术移位与逻辑移位

        00000000 00000000 00000000 00000111,右移后得到:

        00000000 00000000 00000000 00000011,结果为3。

        在正整数中算术移位与逻辑移位结果是一样的,我们如果想要测试在编译器中使用的是算术移位还是逻辑移位我们使用负数测试

        以-7为例

        11111111 11111111 11111111 11111001

        算术右移:

        11111111 11111111 11111111 11111100,我们运算一下,看看结果,反码为:

        11111111 11111111 11111111 11111011,原码为:

        10000000 00000000 00000000 00000100,得到结果为-4

         我们编写代码实验一下:

        

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int a = -7;int b = a >> 1;printf("%d\n", a);printf("%d\n", b);return 0;
}

      运行结果:

  

        实验结果证明,在我们编译器中使用的移位操作是算术移位。        

        当然了,我们这里大多数编译器使用的都是算术移位,逻辑移位使用的并不多,这里我们就不多做阐述。        

        今天就到这里喽,希望这些知识可以帮助到大家,博主略尽微博之力,一起加油!共勉!

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

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

相关文章

如何降低漏测, 避免上线后出bug,6年测试心得分享

一、漏测原因总结 &#xff08;1&#xff09;需求评审质量低&#xff0c;需求设计简单、只是简单描述功能&#xff0c;功能逻辑较少   &#xff08;2&#xff09;需求变更频繁   &#xff08;3&#xff09;缺少需求分解&#xff08;sql 文档、用例设计&#xff09;   &…

爬取东方财富股票代码

我们打开东方财富网站&#xff1a;http://quote.eastmoney.com/stocklist.html 假如懒得爬&#xff0c;也可以用现成的股票数据源&#xff1a;https://stockapi.com.cn 这展示了所有股票信息&#xff0c;不过需要我们分页去爬取 我们可以查询具体的html代码&#xff1a; <…

考研数学|《1800》《1000》《660》《880》如何搭配❓

这几本书都是不同阶段对应的习题册 我觉得最舒服的使用就是方式就是基础阶段用《1800题基础部分》然后强化阶段主要刷《880题》并且强化阶段带着刷《660题》 上面是我的使用方式。之所以没有刷《1000题》是因为这本习题册的难度对我来说还是太大了&#xff0c;并且计算量很大…

LeetCode 每日一题 Day 123-136

1379. 找出克隆二叉树中的相同节点 给你两棵二叉树&#xff0c;原始树 original 和克隆树 cloned&#xff0c;以及一个位于原始树 original 中的目标节点 target。 其中&#xff0c;克隆树 cloned 是原始树 original 的一个 副本 。 请找出在树 cloned 中&#xff0c;与 tar…

【Python基础】—— scipy.spatial.KDTree、matplotlib.pyplot、imageio

scipy.spatial参考博客&#xff1a;Python点云处理——建立KDtree 1 KDtree算法原理 KDtree构建出了一种类似于二叉树的树形数据存储结构&#xff0c;每一层都对应原始数据中相应的维度&#xff0c;以K层为一个循环&#xff0c;因此被称为KDtree。 每一层的左右子树的划分依据…

PLC扩展更自由,钡铼IOy系列模块实现DI/DO/AI/AO任意组合

随着工业自动化的不断发展&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;作为工业控制领域的核心设备&#xff0c;扮演着至关重要的角色。而钡铼IOy系列模块作为PLC的重要扩展设备&#xff0c;不仅实现了DI&#xff08;数字输入&#xff09;、DO&#xff08;数字输出…

Noisy Student(CVPR 2020)论文解读

paper&#xff1a;Self-training with Noisy Student improves ImageNet classification official implementation&#xff1a;https://github.com/google-research/noisystudent 本文的创新点 本文提出了一种新的半监督方法Noisy Student Training&#xff0c;主要包括三步…

L2-3 完全二叉树的层序遍历

完全二叉树的层序遍历 一个二叉树&#xff0c;如果每一个层的结点数都达到最大值&#xff0c;则这个二叉树就是完美二叉树。对于深度为 D 的&#xff0c;有 N 个结点的二叉树&#xff0c;若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点&#xff0c;这样的树就是完全…

防止企业数据泄密的四种有效措施

防止企业数据泄密的四种有效措施 泄密大案每天都在上演&#xff0c;受害者既有几十人的小型企业&#xff0c;也有上万人的世界500强&#xff0c;为什么这些企业都难逃数据泄露的噩梦呢&#xff1f;我们应该采取什么措施来防止信息泄密呢&#xff1f; 首先我们来看看数据泄密的…

Slf4j+Log4j简单使用

Slf4jLog4j简单使用 文章目录 Slf4jLog4j简单使用一、引入依赖二、配置 log4j2.xml2.1 配置结构2.2 配置文件 三、使用四、使用MDC完成日志ID4.1 程序入口处4.2 配置文件配置打印4.3 多线程日志ID传递配置 五. 官网 一、引入依赖 <dependencies><dependency><g…

C++项目 -- 负载均衡OJ(一)comm

C项目 – 负载均衡OJ&#xff08;一&#xff09;comm 文章目录 C项目 -- 负载均衡OJ&#xff08;一&#xff09;comm一、项目宏观结构1.项目功能2.项目结构 二、comm公共模块1.util.hpp2.log.hpp 一、项目宏观结构 1.项目功能 本项目的功能为一个在线的OJ&#xff0c;实现类似…

leetcode1448.统计二叉树中的好节点数目

1. 题目描述 题目链接 2. 解题思路 首先看一下题目的“核心”&#xff0c;什么是好节点&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。也就是说&#xff0c;我们只要知道了从根节点到该节点的所有的值&#xff0c;就可以判断该节点是…