C语言-【移位操作符详解】

news2025/1/23 15:11:09

         这篇文章主要介绍了C语言中移位操作符,文章中通过详细的代码以及有关计算机中零碎的知识点对移位操作符进行了一个更好的解释,需要的小伙伴们可以一起学习学习吖~

移位操作符:移动的是补码的二进制序列。

在C语言当中,有两种移位操作符:

(1)左移操作符:<<

(2)右移操作符:>>

是不是符号很容易混淆啊,大家记住它们的时候就想着箭头的方向朝哪边,就是什么操作符。

在进入正题之前,先给大家普及一下关于整数在内存中存储的相关基础知识吧

大家要知道,在C语言中整型是四个字节,也就是32bite,在内存中就是一个32位的二进制数字。

那原码,反码,补码分别是什么呢,它们又是如何求的呢?

这三种二进制表示方法,都由符号位和数值位两部分组成,当是正数时,符号位为0;当是负数时,符号位为1;

原码:就是将一个整数转换成二进制的形式,通俗的讲,原码就是一个整数原有的不做任何改变的二进制形式。

反码:在原码的基础上,将原码的符号位不变,其他位按位取反,就可以得到反码。

补码:在反码的基础上,反码加1,就可以得到补码。

举个例子吧:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int m = 10;
	//00000000000000000000000000001010  
	//正数的原码,反码,补码是相同的;
	int m = -10;
	//10000000000000000000000000001010  -- 原码
	//11111111111111111111111111110101  -- 反码
	//11111111111111111111111111110110  -- 补码

	return 0;
}

在计算机内部,整数的存储采用的是以补码的方式进行存储,那么,当读取整数时,还需要采用逆向转换的思想,通俗的讲,就是要将补码转换成原码。

使用补码的原因:

        因为使用补码。可以将符号位和数值域统一处理,与此同时,加法和减法也可以统一处理,这里需要注意,CPU只有加法器,除此之外,在补码与原码相互转换的过程中,它的运算过程是相同的。在内存中存放的是补码,但打印出来,也就是我们所看到的可是原码吆。如果大家原码转化成补码已经很熟悉,那么也应该具有逆向思维,掌握补码如何转化为原码哦~

一. 左移操作符

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

举个例子最好说明了:

假如,我们定义一个整型变量n,给n赋初值为5,将n左移,即n<<1,那结果是什么呢?

     前面已经介绍了整型在内存中的存储方式,那么我们就知道整型5在内存中的存储方式是以补码的形式存在的,那么将5左移1位,也就是将5的二进制位向左移动1位,并且将移动的这一位抛弃右边补0,所得到的就是5<<1 位的结果了。

运行结果:

 

 二.右移操作符

右移运算分为两种:

(1)逻辑移位:左边用0填充,右边丢弃

(2)算数移位:左边用该原值的符号位填充,右边丢弃;

还是举例子吧,哈哈:

假如,我们定义一个整型变量n,给n赋初值为5,将n右移,即n>>1,那结果是什么呢?

 分情况讨论:

a:假如说右移是算数移位:

通俗的讲,就是将5在内存中存储的二进制位右移1位,把右边移动的这位抛弃,左边用该值存储的二进制位的符号位填充 ,所得到的结果就是5>>1位的结果了。

 运行结果:

 

b:假如说右移是逻辑移位:

通俗的讲,就是左边用0填充,右边丢弃,因为在内存中,当整数为正数时,其符号位是用0表示的,所以,对于正整数来说,两种移位方法所得到的结果都是相同的。

    那么,如果是对于负整数呢?接下来试试吧:

a:假如说右移是算数移位:

b:假如说右移是逻辑右移:

 咦,怎么出现不一样的结果了呢? 

这里就有个小注意:在C语言标准中,并没有明确定于对于有符号数应该使用哪种类型的右移,但是,实际上几乎所有的编译器/机器组合都对有符号数使用算术右移,不过,对于无符号数,右移必须是逻辑的。

 警告⚠:

对于移位运算符,不要移动负数位,这个是为标准定义的。

比如:

int num = 10;
num >> -1; error

  好啦,关于C语言移位操作符就介绍到这里啦,如有不足之处,欢迎各位小伙伴们指点吖~

 

 

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

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

相关文章

English Learning - L3 作业打卡 Lesson2 Day8 2023.5.12 周五

English Learning - L3 作业打卡 Lesson2 Day8 2023.5.12 周五 引言&#x1f349;句1: The color green is natural for trees and grass.成分划分弱读语调 &#x1f349;句2: But it is an unnatural color for humans.成分划分弱读连读语调 &#x1f349;句3: A person who h…

React | React组件化开发(二)

✨ 个人主页&#xff1a;CoderHing &#x1f5a5;️ React .js专栏&#xff1a;React .js React组件化开发(二) &#x1f64b;‍♂️ 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; &#x1f4ab; 系列专栏&#xff1a;吊打面试官系列 16天学会Vue 11天学会React …

【TOP生物信息】使用SingleR注释细胞类型

扫码关注下方公粽号&#xff0c;回复推文合集&#xff0c;获取400页单细胞学习资源&#xff01; 本文共计1887字&#xff0c;阅读大约需要6分钟&#xff0c;目录如下&#xff1a; SingleR基本介绍 SingleR包安装 SingleR包使用 1.使用已有的参考数据集进行细胞定义2.使用自定…

NAS内网穿透

3)可用方法1&#xff1a;Tailscale&#xff08;免费&#xff09; Tailscale 是一种基于 WireGuard 的虚拟组网工具 下面教大家安装&#xff1a; 镜像仓库搜索&#xff1a;tailscale&#xff0c;就是第一个 下载之后安装配置注意&#xff1a; 1&#xff09;要把权限全部打开…

C++游戏服务器框架笔记(四)_封装Select

C游戏服务器框架笔记(一)_封装数据包类 C游戏服务器框架笔记(二)_封装Socket类 C游戏服务器框架笔记(三)_封装ByteBuffer类 C游戏服务器框架笔记(四)_封装Select 因为设想的次系列服务器主要应用场景是linux系统下&#xff0c;支持Windows系统是为了更好的调试和开发&#x…

【sqlite】联查Join更新

系列文章 C#底层库–MySQLBuilder脚本构建类&#xff08;select、insert、update、in、带条件的SQL自动生成&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库操作辅助类&#xff08;推荐阅读&#xff0…

虚拟化技术 — 虚拟机迁移

目录 文章目录 目录Libvirt 的 Live Migration(热迁移)网络数据传输层控制层Pre-Copy Live MigrationLibvirt 的 Live Migration(热迁移) Libvirt 的 Live Migration 主要分为 “数据“ 和 “控制“ 这两个层面的内容。 网络数据传输层 基于 Hypervisor 的传输:两个 Hyp…

MiniGPT-4 笔记

目录 简介 实现方法 效果及局限 参考资料 简介 MiniGPT-4 是前段时间由KAUST&#xff08;沙特阿卜杜拉国王科技大学&#xff09;开源的多模态大模型&#xff0c;去网站上体验了一下功能&#xff0c;把论文粗略的看了一遍&#xff0c;也做个记录。 论文摘要翻译&#xff1…

【图】DFS、BFS遍历

图有两种遍历方式&#xff1a;DFS深度优先&#xff0c;BFS广度优先。 把所有顶点访问一遍&#xff0c;且每个顶点只访问一次&#xff0c;把走过的顶点标记一下。 标记&#xff1a;为图设置一个访问标志数组visited[n&#xff3d;&#xff0c;用于标示图中每个顶点是否被访问过…

C++引用()笔记

C引用(&)笔记 1.寄存器一般只有4/8个字节&#xff0c;所以返回时候的中间变量(下图的临时变量)不一定是储存在寄存器当中 2.传引用返回可以减少拷贝&#xff0c;增加效率 但运行打印会出错的&#xff0c;因为当栈帧销毁的时候&#xff0c;清理栈帧就会得到随机值 正确表达…

西宾蜻蜓FM语音下载(qingtingdown)

一、介绍 西宾蜻蜓FM语音下载&#xff08;qingtingdown&#xff09;&#xff0c;能够帮助你下载蜻蜓FM音频节目。如果你是蜻蜓FM会员&#xff0c;它还能帮你下载会员节目。 二、下载地址 本站下载&#xff1a;西宾蜻蜓FM语音下载&#xff08;qingtingdown&#xff09; 百度…

PSP - AlphaFold2 适配不同来源搜索的 MSA 接口

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130594303 MSA (Multiple Sequence Alignment) 在 AlphaFold2 中的工作方式如下: 使用搜索工具 (hhblits/hhsearch/jackhmmer),从大型数据库中,搜索与目标…

从零开始学习JVM(二)--类加载子系统

1. 类加载子系统介绍 JVM内存结构如下图所示&#xff1a; 程序计数器&#xff08;PC寄存器&#xff09;&#xff1a;程序计数器是⼀块⼩的内存空间&#xff0c;可以看作是当前线程所执⾏的字节码的⾏号指示器。字节码解释器⼯作时通过改变这个计数器的值来选取下⼀条需要执⾏…

PyTorch读取数据集全部进内存,使网络的训练速度提高10倍以上!!!

正常情况下&#xff0c;torch读取数据的时候是Batch Size小批量读取。首先找到所有数据集的路径保持到一个变量中&#xff0c;之后需要读取哪个数据的时候&#xff0c;就根据这个变量中的路径索引去读取。因为硬件的限制&#xff0c;从硬盘中读取数据到显存中所花的时间要远远大…

计算机体系结构实验一

计算机体系结构实验一 一.实验目的 ​理解RISC-V的指令执行的数据流和控制信号&#xff0c;熟悉指令流水线的工作过程。 二.实验过程 1.RISC-V的相关指令 实验的模拟器使用RISC-V指令集&#xff0c;为了便于后续分析&#xff0c;首先学习实验中使用的RISC-V指令。 基本RIS…

Cesium最新版使用天地图地形及注记服务

天地图三维地名服务和地形服务需要利用 cesium 开源三维地球API与天地图扩展插件共同使用&#xff0c;目前支持cesuim1.52、1.58、1.63.1。 天地图调用demo: http://lbs.tianditu.gov.cn/docs/#/sanwei/ 注意&#xff1a; demo里的地形服务地址不对&#xff0c;需要自己更换成…

MCU通用移植方案

MCU通用移植方案 目录 MCU通用移植方案前言1 硬件移植2 软件移植2.1 底层移植方法2.1.1 移植原理2.1.2 移植方法 2.2 中间层移植方法2.2.1 移植原理2.2.2 移植方法 2.3 两种移植方法比对 3 结束语 前言 因为项目的需求或者成本控制等因素&#xff0c;我们经常会遇到更换MCU的情…

华硕 PRIME H610M-A D4 i5-12490F 1060电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板华硕 PRIME H610M-A D4&#xff08;LPC Controller/eSPI Controller H610芯片组&#xff09; 处理器12th Gen Intel Core i5-12490F 六核已驱动 内…

Mysql的重要知识点以及问题

查看索引的命令 show index from mytable 索引的原理 索引用来快速地寻找那些具有特定值的记录。如果没有索引&#xff0c;⼀般来说执行查询时遍历整张表。 索引的原理&#xff1a;就是把无序的数据变成有序的查询 把创建了索引的列的内容进行排序 对排序结果生成倒排表…

货运物流小程序开发功能有哪些?

移动互联网的深入发展让网购等线上交易更加盛行&#xff0c;货运快递物流也随之增多&#xff0c;成为我们日常生活的重要组成部分。传统的货运物流管理主要依赖人工&#xff0c;不仅效率慢还容易出错。随着市场的发展以及人们对服务质量要求的提高&#xff0c;现在很多中大型货…