事情的发生:

某日工作中有个需求是将不同的数值存到char的前4位和后4位中。

恰好同事中有同样取得32位int的前8位当成一个数值的代码:

//取得32位中的高八位组成的值

#define U32_HIGH_8(val) ((val >> 24) & 0X000000FF)

好奇心就来了,在右移24位以后是否还有必要再与上(&)0x000000FF将高位的数据彻底清零呢?

讨论:

考虑以下几个问题:

(1)

char i = 0x40; //二进制中i的表示为:0100 0000

unsighedchar j = 0x40;

i<<= 1;

j<<= 1;//问:i和j分别等于多少?

i 左移以后的二进制表示为:1000 0000,由定义的有符号char解释为:i = -128

j 左移以后的二进制表示为:1000 0000,由定义的无符号(unsigned char)解释为:i = 128

(2)

char i = 0x80;//二进制中表示为:1000 0000

char j = 0x40;//二进制中i的表示为:0100 0000

j >>= 1;

i>>= 1;//问i和j等于多少?

i 右移以后的二进制表示为:1100 0000(右移对于负数来说符号位右移,高位补1),故i=-64

j 右移以后的二进制表示为:0010 0000(右移对于正数来说符号位右移,高位补0),故i=32

(3)

char i = -3;//二进制表示为:1111 1101//i << 1是多少? i >> 1是多少?

i << 1的二进制表示为:1111 1010(左移为逻辑左移高位丢弃,低位补0),由有符号数char解释为:-6

i >> 1的二进制表示为:1111 1110(右移为算术右移,对于负数来说高位补1),有有符号数char解释为:2

左移右移总结:

右移左移涉及丢弃、补0或补1,但是最终对这一串二进制解释成什么数值是通过变量的定义(是否unsigned)来决定的。

左移始终是逻辑左移,即丢弃高位,低位补0;

右移是算术右移,对于有符号数:正数右移高位补0,负数右移高位补1。对于无符号数:逻辑右移(即高位补0,低位丢弃);

结论:

那么开头的问题是:是否还有必要再与上(&)0x000000FF将高位的数据彻底清零呢?

我认为还是有必要的,因为并不知道值的类型是否是无符号数(unsigned),假如原本的32位数是普通的int类型且二进制为(1000 0000……0000 0000),那么取高8位的时候的二进制表示(1111 1111……1000 0000),那么这个数解释出来就会非常大且出错。如果是无符号数的话还算正常。

因此为了避免日后定义错类型导致的错误,还是将移位以后的二进制的高位与上(&)0,将高位彻底清0为好。

c语言右移高位如何补1,c语言负数左移右移相关推荐

  1. c语言负数左移右移_C语言位运算符:与、或、异或、取反,左移和右移

    C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...

  2. c语言负数左移右移_C语言左移和右移

    事情的发生: 某日工作中有个需求是将不同的数值存到char的前4位和后4位中. 恰好同事中有同样取得32位int的前8位当成一个数值的代码: //取得32位中的高八位组成的值 #define U32_ ...

  3. c语言负数左移右移_C语言位运算符:与、或、异或、取反、左移和右移!

    语言位运算符:与.或.异或.取反.左移和右移 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符 ...

  4. c语言负数左移右移_C语言 位运算符的运算规则

    位运算是指按照二进制进行的运算,在C语言中,提供了6种的位运算符,他们分别是按位与(&),按位或(|),按位异或(^),按位取反(-),左移(<)和右移(>).这些运算符只能用整型 ...

  5. c语言负数左移右移_C语言里的左移和右移运算

    C语言里的左移和右移运算 先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用运算符.例如:int i = 1;i = i 2; /把i里的值左移2位也就是说,1的2进制是000.0001(这 ...

  6. c语言负数左移右移_C语言中关于循环左移和循环右移

    昨天在解答同学的问题中,又接触了好久没碰的C中的位操作.在重接触的过程中,又理解了一遍计算机存储数据的细节,于是分享给大家看一下. 让我们先看一下题目:编写一个程序,输入两个整数i.j,如果j的值大于 ...

  7. c语言左边自动补零,c语言左移4,余位补零 时不时乘以16?

    c语言左移4,余位补零 时不时乘以16?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! c语言左移4,余位补零 时不时乘 ...

  8. c语言左移15位,关于c语言中左移右移运算符的问题

    参照<c与指针>,在c语言中左移时,不论算术左移还是逻辑左移效果都是相同的.而且对于有符号和无符号类型执行相同的操作,即按照二进制位向左左移N位.例如: 1 clude 2 intmain ...

  9. 无符号右移负数_关于负数的右移与无符号右移运算小结

    对于带符号右移,若为负数,则在存储时首位表示符号位,其值为1,表示该值是负数的移位,在移位过程中,高位补1,若符号位是0,表示是正数,在移位过程中高位补零,两者的前提是符号位保持不变: 对于负数的右移 ...

最新文章

  1. tensorflow.python.framework.errors_impl.UnknownError: Failed to get convolution algorithm.的一种解决方法
  2. CVPR 2020 | CMU HKUST提出binary网络自动化搜索,同时实现超高压缩与高精度
  3. java版b2b2c社交电商spring cloud分布式微服务(二) 服务消费者(rest+ribbon)
  4. 完美解决ArcGIS10.2和Erdas9.2软件冲突的方法:共存!
  5. 《独家记忆》见面会高甜宠粉 张超现场解锁隐藏技能
  6. 精彩预告:还在迷茫吗,DBA的未来,他们怎么看?
  7. hosts文件修改完无效的解决办法
  8. 夏令营讲课内容整理 Day 6 Part 3.
  9. Ubuntu18.04版本安装ssh及连接ssh的常见问题
  10. 计算机应用技术个人研修总结,学习应用信息技术的研修体会总结
  11. 软件质量需要静态代码分析和动态测试
  12. 驱动开发:挂接SSDT内核钩子
  13. biopython----bio.PDB
  14. Apache Beam开发指南
  15. 5.NDK Android jni开发 异常处理 native奔溃解决(相机图片美化)
  16. 机器学习:SVM支持向量机理解
  17. 微信公众号 用户绑定 php,微信公众号开发——网页授权实现简化用户绑定
  18. 他博士毕业论文写了1255页,28岁评教授,38岁当院士!
  19. java 实体转map
  20. 【测评】迅为4418/6818开发板安卓Android开发板

热门文章

  1. 输入一个正整数n,输出1到n的所有排列
  2. iPhone App Store提交流程
  3. 帷幄SDP - 店铺数字化转型 店铺数字化智能营销服务平台
  4. CI持续集成系统环境---部署Jenkins完整记录
  5. git 解决冲突的方法
  6. 极简智能获ISO9001质量管理体系认证证书
  7. 有名管道----mkfifo函数总结
  8. 我的时间管理——充分利用WindowsPhone、Android等设备,实现真正的无压工作!
  9. Android USB驱动源码分析
  10. 在linux中hdparm作用,關於Linux中hdparm的應用