C 语言中负数移位运算讲解
“<<”、“>>”为移位运算符。 “<<”为左移位运算符,即数据字节中的每个二进制位同时
向左移位。如“x<<n”表示 x 中的每个二进制位同时向左移动 n 位。 “>>”为右移位运算
符,即数据字节中的每个二进制位同时向右移位。如“x>>n”表示 x 中的每个二进制位同时
向右移动 n 位。
下图演示了一个 2 字节变量左移 3 位的过程:
十进制数-555 的二进制表:
1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1
先转换成二进制补码表:
1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0
最左端位保持不变 补码加“1”后状态
再将补码加“1”:
1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1
下一步向左移 3 位:
1 1 1 0 1 1 1 0 1 0 1 0 1 0 0 0
左端“离开”3 位丢弃 右端“移入”3 位用“0”补齐
最左端一位保持不变
再转换成二进制补码表:
1 0 0 1 0 0 0 1 0 1 0 1 0 1 1 1
补码再加“1”:
到此步结束。
1 0 0 1 0 0 0 1 0 1 0 1 1 0 0 0
补码加“1”后状态
结果转换成十进制数为“- 4440”。
总结:负数左移时,任何情况下“移入”位将用“0”补齐。
“>>”右移位运算可分为两种情况:一种是移入“0”的叫逻辑右移;一种是移入“1”的叫
算术右移。 负数右移用到的是算术右移。
下图演示了一个 2 字节变量右移 3 位的过程:
十进制数-555 的二进制表:
1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1
先转换成二进制补码表:
1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0
最左端位保持不变 补码加“1”后状态
再将补码加“1”:
1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1
下一步向右移 3 位:
1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0
左端“移入”3 位用“1”补齐 右端“离开”3 位丢弃
最左端一位保持不变
再转换成二进制补码表:
1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1
补码再加“1”:
到此步结束。
1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
补码加“1”后状态
结果转换成十进制数为“- 70”。
总结:负数右移时,任何情况下“移入”位将用“1”补齐。
注:二进制表最左端的二进制位表示符号位,“+”用“0”表示,“-”用“1”表示。
相关推荐
详解C语言中的移位操作符(顺带复习原码反码补码)
对于左移, 不论正负,高位舍弃,低位统一补0对于右移,正、负整数的低位处理规则相同,但是正数的高位补0,负数的高位补1在左移、右移得到结果之后,如果符号位是0,说明是正数,那么结果就是我们要求的值,如果最高位是1,说明是负数,我们还需要求得到结果的原码,原码对应的值才是我们要求的值右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位一律补0,或者补符号位,这由不同的机器而定,我们讨论的是补符号位对于移动的位数 我们都使用正数,不要使用负数。
C语言之负数的左移/右移运算
在实际上的开发中,很少碰到针对负数的移位操作,基本上都是无符号整数即unsigned int类型。但有时候在笔试或者面试中,有可能会碰到此类情况,下面就简单讨论一下。(若有错误之处,劳请大家指出)
C语言位运算核心:移位运算符详解与工程实战
计算机中的整数以二进制形式存储,理解位运算是掌握底层编程的关键一环。补码表示法决定了负数在内存中的形态,也直接影响了右移时是补0还是补符号位,即逻辑移位与算术移位的区别。左移在无符号场景下可高效实现乘以2的幂,但若溢出或推入符号位,结果可能变成负数或0;右移在无符号数上行为确定,在有符号数上则依赖平台。位运算的价值在于通过移位与掩码配合,快速完成标志位判断、寄存器配置、协议解析和颜色分量提取等操作,在嵌入式开发、网络通信和驱动编写中广泛使用。本文从二进制存储基础出发,结合代码示例,深入剖析C语言移位运算符的
计算机中负数的移位
计算机是用反码存储整型的数字类型的,整数的补码和原码一致。 负数有个简单的计算反码的方法:算出负数绝对值的原码,从原码的右边开始找,找到第一个不为0的数,前面的数全部取反。 负数向左移位,在右边直接加0 负数向右移位,在左边直接加1 比如-1向左移动29位,-1在计算机中的表现形式:11111111111111111111111111111111,向左移动29位以后,变成11100000000000000000000000000000。 -1向右移动29位,由于是在右边添加1,所以表现形式不变,依
QEMU pcie config空间访问机制
而pci_host_conf/data_le_ops的定义是在hw/pci/pci-host.c里,对于0xCF8端口的处理,因为是地址选通,所以只需要在write的时候记录、read的时候返回记录的值即可。而pci_host_config_write/read_common接口,在前256Bconfig空间的模拟中,也同样是会调用这个接口,所以后续的处理都是一样的。这是真实的硬件设计,而对于QEMU+KVM的虚机场景,显然是要基于硬件实现和虚拟化的需求设计虚机访问config空间的完整流程。
将ue4程序嵌入qt界面显示
需求:将ue4程序嵌入qt界面显示 思路:通过使用 windowsAPI 对ue4窗口进行设置跟随qt界面以及活动窗口时的位置层序设置
负数位运算的右移操作-C语言基础
这一篇探讨的是“负数位运算的右移操作”,涉及到数据的源码、反码、补码的转换操作。属于C语言基础篇。 先看例子 #include &amp;amp;lt;stdio.h&amp;amp;gt; int main(void) { //正数的位右移 //补码0000 0101 int x = +5; //正数补码右移两位后 //补码0000 0001 printf(&amp;quot;+5&amp;amp;gt;
手把手教你用QEMU虚拟化华为路由器固件(附完整网络配置指南)
本文提供了一份详尽的QEMU虚拟化华为路由器固件的实战指南。从固件解包、网络桥接配置到QEMU虚拟机启动,手把手教你搭建完整的嵌入式设备沙箱环境,特别适合安全研究、逆向分析和学习嵌入式系统工作原理。
负数的位移(右移)
这里只是针对 右移。 (左移对负数,正数 的影响不大,都只需要右边补0即可。) 首先 我们看到的数,都是以二进制的形式在计算机下操作的。并且位运算符的操作对象是补码。 正数: 原码=反码=补码 负数: 原码 ----> 反码 (取反) ---->补码 (+1) 如整型 int a =10; 0000 0000 0000 0000 0000 0000 0000 1010 (这个是原码) 因为是正数,所以可以直接操作进行位移。 以负数进行演示: 计算结果: 1000 0000 000
利用python语言进行相机标定
利用python语言进行相机标定 目录利用python语言进行相机标定一、相机标定相关原理1.相机标定简介2.坐标映射2.1图像坐标系1)图像坐标系(Pixel coordinate system)2)成像平面坐标系(Retinal coordinate system)3)摄像机坐标系(Camera coordinate system)4)世界坐标系(World coordinate system)二、相机标定算法流程1.镜头畸变1.1径向畸变1.2切向畸变2.相机标定算法求解外参内参和单应矩阵关系求解(张
Spine换装系统深度优化:从局部换肤到动态合批的进阶之路
本文深入探讨了Spine换装系统的性能优化策略,从局部换肤到动态合批的进阶技术。通过分析传统方案的性能瓶颈,提出动态合批、GPU Instancing等高级优化方法,显著降低Draw Call和内存占用,提升游戏性能。适用于MMO和大型游戏开发,帮助技术美术和工程师突破大规模换装场景的性能限制。
C语言中负数移位运算讲解
http://blog.163.com/jiaqiang_wang/blog/static/1188961532009924111934698/ http://canlynet.iteye.com/blog/1796889 http://blog.youkuaiyun.com/gaochizhen33/article/details/7161417 http://blog.youkuaiyun.com/mustan
人形机器人电路板和算法分析
人形机器人电路板与算法深度剖析 电路板领域:人形机器人电子系统分为计算、驱动、感知、能源、通信五大模块。主控板采用高性能SoM(如NVIDIA Jetson AGX Orin),需满足严格电源完整性(PDN)与信号完整性(SI)要求;关节驱动板集成MCU、GaN/SiC功率器件及高精度编码器接口,采用刚柔结合PCB以适应狭小空间。挑战包括热-振可靠性(85°C/10G振动)、高密度互连(3mil线宽)及EMC兼容性。 算法领域:运动控制依赖MPC(模型预测控制)与强化学习(RL),实现实时动态平衡;感知算法
c语言缩小数值,C语言中数值的移位运算
在C语言中的数值可以实现移位运算,由于数值分为无符号(unsigned)和有符号(signed),这两种的数值运算方式不一样。无符号数值的运算很简单,总结一句话就是移位和补零,而有符号数值的移位需要注意一下。当数值是有符号的时候,如果是左移的话就是移位和补零,所以一个正数可以通过移位变成一个负数或者是零;但如果是右移的话,就不太一样。由于是有符号数,可能发生逻辑右移,也可能发生算术右移,这一点,C...
8.9华为OD机试真题 新系统 - 查找最佳充电策略 (Java/Py/C/C++/Js/Go)
8.9华为OD机试真题 新系统 - 查找最佳充电策略 (Java/Py/C/C++/Js/Go)
【漏洞复现】WordPress Plugin NotificationX 存在sql注入CVE-2024-1698
技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。WordPress和WordPress plugin都是WordPress基金会的产品。WordPress Plugin NotificationX 存在安全漏洞,该漏洞源于对用户提供的参数转义不充分以及对现有 SQL 查询缺乏充分的准备,很容易通过“type”参数受到 SQL 注入攻击。
java右移位怎么算_算术移位和逻辑移位详解
大部分的C编译器,用移位的方法得到代码比调用乘除法子程序生成的代码效率高。移位运算是将数值向左向右移动,对于十进制来说就是实现放大十倍和缩小十倍的效果,而对于二进制而言就是放大两倍和缩小两倍的效果整数的乘除法一个自己曾经忽视的东西,那就是C/C++中的移位操作容易出错的情况。1、什么样的数据类型可以直接移位char、short、int、long、unsigned char、unsigned sho...
廖雪峰Python教程[完整版]
廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白
对C语言符号的一些冷门知识运用的剖析和总结
单引号内至少要有一个字面值// 0|0 = 0;0|1 = 1 // 规律:任何数或0结果都是它本身 //用途:// 1|0 = 1;1|1 = 1 // 规律:任何数或1,结果都是被设置为1 //用途:特定 比特位 置1// 组合用途:让特定比特位置1,其他位不变// 0&0 = 0;0&1 = 0;// 规律:任何书与0,结果都是被设置成0 //用途:特定比特位置0// 1&0 = 0;1&1 = 1;// 规律:任何书与1,结果都是它本身 //用途:获取特定比特位的值。
蓝牙模块HM-10手册
蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。
大中型超市收银系统(可直接运行)
光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开
位运算基本概念以及在程序设计中的应用
正数原码负数补码正数的原码=反码=补码源码将一个整数,转换成二进制,就是其原码左边的第一位为符号位,正数位0,负数为1正数的反码就是其原码负数的反码是将原码中,除符号位以外,每一位取反。正数的补码就是其原码:负数的反码+1就是补码。
[C语言]操作符详解
操作符分类算术操作符移位操作符原码、补码、反码左移操作符移位规则右移操作符 移位规则位操作符赋值操作符复合赋值符单目操作符逻辑反操作符sizeof和数组自增和自减运算符关系操作符逻辑操作符短路运算条件操作符逗号表达式下标引用、函数调用和结构成员1.[ ] 下标引用操作符2.( ) 函数调用操作符3.访问一个结构的成员 算术操作符 + - * /&n
C语言:操作符(上)
目录一、算数操作符二、移位操作符补充:二进制(基础)1).正数2).负数移位操作符左移操作符右移操作符三、位操作符四、单目操作符五、逗号表达式+ — * / %对于 / ,两边都是整数,则结果为整数;两边只要有一个浮点数,则结果为小数> 右移操作符注:移(2进制)位操作符的操作数只能是整数整数的二进制表示形式有3种:原码,反码,补码按照一个数的正负,直接写出它的二进制序列得到的就是原码10的二进制表示形式为1010,12=(1*2^3)+(1*2^2)+
scanf&逻辑运算符
scanf有返回值,返回值的大小就是输入成功的个数(如果有3次ctrl z则终止输入)左移 10 0000 1010<<变成0001 0100变成了20,每次移动乘以2;=-1)<实际就是返回值。scanf("d=%d")的格式是什么就要按什么格式输入;复合赋值法:a=a+3等于a+=3,a=a*3等于a*=3。注意:整数除以整数只能是整数;-1移动还是-1 (移动补码)一个都没有读则是规定的-1;%:3%2=1<求余数>那为啥-5/2为-3呢?
c语言基础篇:操作符
c语言基础篇:操作符
C语言位运算:深入了解移位操作符与位操作符
按位或(|)、按位与(&)和按位取反(~)、按位异或(^)、移位运算(<<、>>)一样,所有位运算的操作对象都是计算机中存储的补码形式的二进制数。 大家请先弄清楚二进制的原码 反码 补码 再来学习位操作符移位操作符的操作数只能为整数!移位操作符针对的是二进制数,并且是用补码计算的 符号位0的二进制原 反 补码相同 num:10的二进制补码:00000000 00000000 00000000 000001010 num<<1:的二进制原码:00000000 00000000 00000000 0001010
【c语言】操作符、位运算、存储
我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题 的。8.存储、大小端大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。
C语言移位运算符详解:左移右移、补码与实战应用
在计算机底层,数据以二进制形式存储,位运算是直接操作这些二进制位的核心技术。移位运算符作为位运算的重要成员,通过将整数的二进制位整体左移或右移,实现快速乘除、状态位管理、字节拼接等功能。理解补码与位宽是掌握移位运算的关键,它能帮助开发者分析负数右移时的符号位行为,以及避免溢出和优先级陷阱。在嵌入式开发、网络协议解析和图像处理等领域,移位运算符广泛应用于掩码构造、字段提取与颜色编码。对于C语言初学者,掌握移位运算符不仅能增强对内存和数据类型本质的认识,还能为阅读底层源码打下基础。本文围绕左移、右移、优先级、边
1001



被折叠的 条评论
为什么被折叠?



