事情的发生:

某日工作中有个需求是将不同的数值存到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语言中2UL左移16位是多少,C语言左移和右移(示例代码)相关推荐

  1. c语言中 amp amp 是位运算符吗,c语言位运算符(c语言位运算符的用法举例)

    C语言中的按位运算符 & | ^ ~ > 分别要怎么用?哪位大虾能详细讲解一下!!. 1.按位运算符就是直接对整数在内存中的二进制位进行操作运算.比如,&&运算本来是一个 ...

  2. c语言中null未声明,错误:此范围内未声明“NULL”(示例代码)

    我在gcc 4.3上编译C ++时收到此消息 error: 'NULL' was not declared in this scope 它出现并消失,我不知道为什么.为什么? 谢谢. 答案 NULL不 ...

  3. 怎么得到16位校检和-c语言,16位CRC校验C语言算法.pdf

    16位CRC校验C语言算法.pdf CRC 算法原理及C 语言实现 摘 要 本文从理论上推导出CRC算法实现原理,给出三种分别适应不同计算机或微控 制器硬件环境的C语言程序.读者更能根据本算法原理,用 ...

  4. c语言求字符ascii,C语言中ASCII码是什么意思? c语言怎么求字符的ascii码

    导航:网站首页 > C语言中ASCII码是什么意思? c语言怎么求字符的ascii码 C语言中ASCII码是什么意思? c语言怎么求字符的ascii码 相关问题: 匿名网友: 是一个字符表,一个 ...

  5. c语言中char是多少字节,c语言中char_char c = \'\\1\' 十进制是多少_c语言char

    网友求助:c语言中char_char c = \"\\1\" 十进制是多少_c语言char 问题 最佳答案 推荐答案 char一般默认是1个字节的无符号整型,范围0~255.如果是 ...

  6. c语言while作用范围,c语言中while是什么意思啊? , c语言while循环的表达式

    导航:网站首页 > c语言中while是什么意思啊? , c语言while循环的表达式 c语言中while是什么意思啊? , c语言while循环的表达式 匿名网友: 事例程序:void mai ...

  7. c语言中ff用16进制怎么表示什么,0xff(十六进制0xff表示什么)

    0xff 从数值上看,0xff表示一个十六进制数FF,也就是十进制的255.从电平高低来看,比如读取P1口得到0xFF,表示P1口8个引脚都是高电平. 以0x开始的数据表示16进制,0xff换成十进制 ...

  8. c语言的程序是32位还是64位,在C语言中,对于32位计算机和64位计算机,long的大小是多少?...

    本问题已经有最佳答案,请猛点这里访问. 对于32位平台,C中的long的大小为4字节,而对于64位平台,为8字节是否正确? 通常,但不一定. 如果要使用固定大小的类型,请使用int32_t或int64 ...

  9. C语言中int类型及位、字节和字的介绍

    在C语言当中,整数类型和数学相同,例如8.27.-2.123都是整数.但需要注意的是,计算机是以二进制数存储整数,例如整数8以二进制1000储存在计算机中. 在计算机中,为了表示整数,提供了int类型 ...

最新文章

  1. StartOS 5.0 正式版发布
  2. Spatial Transformer Networks(STN)代码分析
  3. python定义链表节点_Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】...
  4. jQuery设置radio、select、checkbox只读属性后,如何在后台得到数据
  5. How to find documentation of given API
  6. python logistic回归_logistic回归介绍与源码分析
  7. Mysql面试常见知识点总结(一)
  8. 【BZOJ1597】【Tyvj2461】土地购买,第一次的斜率优化DP
  9. 信捷步进指令的使用_电工想做PLC工程师?那步进电机的编程控制指令你一定要了解...
  10. python学习交流 - 匿名函数
  11. 快轮天才发明家刘峰,上榜福布斯2017年亚洲人物
  12. dos命令 启动项目
  13. Python编写随机一百个人的姓名,加面试考核得分
  14. nginx事件模型小结
  15. java ppt 绘图,PPT图片别再直接插入,这样处理一下,让你的PPT秒变高逼格
  16. MySQL 10060错误 解决方法
  17. CV学习笔记-VGG
  18. java web QQ(三)
  19. 【自然语言处理】【多模态】BLIP:面向统一视觉语言理解和生成的自举语言图像预训练
  20. (1)Air Band调研

热门文章

  1. 如何利用API导出带有页眉页脚的excel
  2. 通用Excel数据匹配助手:强大的Excel工具,让工作更简单
  3. 利用select into直接创建临时表
  4. 冒泡排序的基本实现及优化
  5. 橡皮怪Dici,over,welcome,player
  6. 《当代青年血槽已空图鉴》
  7. zaker在android内容好少,追求更好的阅读体验—Android平台ZAKER,鲜果联播对比评测...
  8. 《黑客军团》如何还原黑客真实的一面?
  9. 27个项目入选行业首支“绿色计算”科研基金,推动算力精细化发展
  10. 2023年全国最新二级建造师精选真题及答案23