c语言 与0xff,带你在过程中理解0xff
在写大作业的时候,一开始对 &0xff 的操作一直处于疑惑状态.。
byte[i] 是8位二进制,0xff 转化成8位二进制就是 11111111,那么byte[i] & 0xff不是还是byte[i]本身吗?
Are you kidding me?
对于这个问题,我在网上看到一个demo很有趣:
#include
int main(void)
{
char byte = -127;
int a;
a = byte;
printf("%d\n", a);
a = byte & 0xff;
printf("%d", a);
return 0;
}
然而~
事情开始有趣了起来…
为什么加了 &0xff 反而不对了呢??
我们先来复习一下补数的概念:
对于正数(00000001)原码来说,首位表示符号位,反码与补码都是本身
对于负数(100000001)原码来说,反码是对原码除了符号位之外作取反运算即(111111110)然后作+1运算即(111111111)
再介绍一下符号扩充的概念:
以8位二进制数为例,符号扩充就是指在保持当前值不变的前提下将其转化为16位和32位的二进制数。规则就是,不管是正数还是用补码表示的负数,都只需要用符号位的值(0或1)来填充高位即可。
进入正题:
当将-127赋值给byte的时候,byte作为一个char类型,其计算机存储的补码是10000001(8位)[在计算机中,负数都是以补码形式储存]。
a = byte;//-127
第一次将 byte 作为int类型向控制台输出的时候,编译器作了一个符号扩充的处理,因为int类型是32位二进制数,所以byte扩充后的补码就是1111111111111111111111111 10000001(32位),这个32位二进制补码表示的十进制数也是-127.这说明符号扩充并不会影响当前对应的十进制数的值。
这是一个很好的性质,但是我们将char类型进行int类型的转化的时候,目的并不仅仅是要保证对应十进制数的不变性。比如说我们这次的大作业,是要将4个char类型转化成1个int类型,这就需要保证二进制补码的一致性,也就是4个char类型所对应的二进制01序列原封不动地作为一个int类型的4个字节(高八位 中八位 中八位 低八位)的二进制序列。
a = byte & 0xff;//129
那我们第二次进行赋值的时候为什么会改变a的值呢?
我们来具体分析一下:
之前介绍了符号扩充的概念,当byte(10000001)要转化为int的时候,高的24位必然会补1。这样,其二进制补码其实就已经改变了。而&0xff(11111111)可以将byte变int时,高的24位设置为0,低8位保持byte的原样。
那可能会有同学疑惑:为什么0xff 高的24位不会同样补1呢?这是因为 0xff或者0xFF本身就是一个int的字面常量,自身就是32位长的,所以不会进行符号扩充。
当然,在我想保证二进制补码一致性的时候,二进制数所对应十进制数自然也就发生变化啦。这是无法兼得滴~
来看看代码的具体实现:
a = byte & 0xff;//129
byte & 0xff = 111111111111111111111111110000001&11111111
=000000000000000000000000 10000001
这个二进制数位权加一下就是129啦
这很好的解释了为什么加了 &0xff 结果反而出错了:
因为这个时候的程序保证了二进制补码的一致性而不是对应十进制数的一致性。
最后
咱们回到刚开始大作业转换算法的问题。我们是想保证二进制补码的一致性,所以要先对byte进行 &0xff 操作。当然假如byte的符号位位0 ,那么 &0xff 就没有什么意义。但是当byte的符号位为1的时候,你就需要掂量一下了,因为你最后是要和 value进行 逻辑或 操作的(很大概率你辛辛苦苦获得的二进制序列可就全部变成1了哦)!!
c语言 与0xff,带你在过程中理解0xff相关推荐
- C 是编译类高级程序语言 对 错,C言语编译过程中的常见过错
言语的最大特点是:功用强.使用方便灵敏.C编译的程序对语法查看并不象其它高档言语那么严厉,这就给编程人员留下"灵敏的地步",但仍是由于这个灵敏给程序的调试带来了许多不方便,特别对初 ...
- python处在哪个阶段_如何在学Python的过程中更好地成长技术
Python是一门编程语言,所以重点在于如何用好这门语言,只有能够做好项目,才能证明自己逐步掌握好了这门语言.在学习阶段,最终的目标是要尝试着自己用Python搭建一个网站,也算是对自己学习成果的一种 ...
- C语言过程测试模拟题_cxf_4,c语言题库(带答案)排版.doc
c语言题库(带答案)排版.doc 一.选择题1.以下不能定义为用户标识符的是( ). A MAIN B _HJ C 2ong D LINE12.以下不能定义为用户标识符的是( ) A If B H_J ...
- c语言中5l是数值或字符常量,C语言练习题-选择题(带答案)
以下为<C语言练习题-选择题(带答案)>的无排版文字预览,完整格式请下载 下载前请仔细阅读文字预览以及下方图片预览.图片预览是什么样的,下载的文档就是什么样的. C语言练习题-选择题(带答 ...
- 非常好的C语言章节习题集带答案,非常好的C语言章节习题集带答案选编.doc
非常好的C语言章节习题集带答案选编 PAGE \* MERGEFORMAT 90 第1章 认识C语言 二.习题(一).是非题1.程序是指挥计算机进行各种信息处理任务的一组指令序列.A.对 B.错2.机 ...
- NS2仿真过程中需要的语言及基本组件
本文介绍使用NS2进行网络仿真通常需要使用的语言以及工具(工具都是linux平台下的). (一)Tcl语言 Tcl(最早称为"工具命令语言""Tool CommandLa ...
- C语言答案解析,C语言题库带详细讲解答案解析.doc
C语言题库带详细讲解答案解析.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3. ...
- c语言调试过程中的错误,C语言调试过程中duplicate symbol错误分析
说明:在我们调试C语言的过程中,经常会遇到duplicate symbol错误(在Mac平台下利用Xcode集成开发环境).如下图: 一.简单分析一下C语言程序的开发步骤. 由上图我们可以看出C语言由 ...
- mchain r语言_布林带交易策略R语言实现
布林带(Bollinger Bands)指标是股市技术分析的常用工具之一.该指标由约翰 布林提出,基于K线图画出三条线,其中上下两条线可以分别看成是股价的压力线和支撑线,而在两条线之间还有一条股价平均 ...
最新文章
- LockSupport 使用
- boost::python::iterator相关的测试程序
- vb for循环 combobox的使用 Print的使用
- EntityFramework Code-First—领域类配置之DataAnnotations
- Mysql数据库使用总结
- Docker安装禅道项目管理平台zendao-v11.6.x
- crypto 乱码_base64编码加密解密程序,输出有乱码,为什么?
- SteamVR简介(Yanlz+Steam+VR+Unity+AR+MR+XR+立钻哥哥+==)
- android 反编译去会员,反编译教程
- #35-【刷题】乐乐的方块
- Detours库APIHook演示抓取微信界面绘制文字函数
- go解析yaml文件示例
- 训练赛一:bfs广搜题目 CF115B Lawnmower
- python3教程:用concurrent执行多进程任务的方法
- JS中Key-Value操作
- C# PrintDocument 打印 和 打印预览
- [转]兰迪.波许的最后讲座:真正实现你童年的梦想(中英文对照)12
- 【Python 基础教程】一文理清Python函数的细枝末节
- Photoshop脚本 另存当前文档
- 二维码(QRcode)容量的计算与版本