c语言 与0xff,带你在过程中理解&0xff[通俗易懂]

c语言 与0xff,带你在过程中理解&0xff[通俗易懂]在写大作业的时候,一开始对&0xff的操作一直处于疑惑状态.。byte[i]是8位二进制,0xff转化成8位二进制就是11111111,那么byte[i]&0xff不是还是byte[i]本身吗?Areyoukiddingme?对于这个问题,我在网上看到一个demo很有趣:#includeintmain(void){charbyte=-127;inta;…

大家好,又见面了,我是你们的朋友全栈君。

在写大作业的时候,一开始对 &0xff 的操作一直处于疑惑状态.。

byte[i] 是8位二进制,0xff 转化成8位二进制就是 11111111,那么byte[i] & 0xff不是还是byte[i]本身吗?

Are you kidding me?

583a99b88c81c6c348bd0907d1f47eea.png

对于这个问题,我在网上看到一个demo很有趣:

#include

int main(void)

{

char byte = -127;

int a;

a = byte;

printf(“%d\n”, a);

a = byte & 0xff;

printf(“%d”, a);

return 0;

}

然而~

8d6bd83ff6e3779b95c709ddee2b99b2.png

事情开始有趣了起来…

为什么加了 &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了哦)!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150811.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • VR全景图制作软件哪个最好?这3款App教你制作一张完美的VR全景照片「建议收藏」

    VR全景图制作软件哪个最好?制作360度全景效果图的软件现在市面上还是有很多的,不同的功能运用在不同的场景之中,生活中,装修设计的等等形式的全景图都有不同的软件可以帮助我们制作。AutodeskStitcher:点击左侧链接下载AutodeskStitcher是一款高品质专业级的全景图制作工具,与AdobePhotoshop无缝平滑对接,广泛用于图象编辑、3D网页、虚拟旅游和超大尺寸全景图印刷等。是专业摄影师、多媒体艺术家和摄影爱好者的必备利器。最新版本能够为业界很多领域提供优良的解决方案,

    2022年4月1日
    1.4K
  • qq刷屏代码如何停止(微信刷屏代码vbs)

    最近有些人向小编反应QQ刷屏代码没办法关,小编认为有必要发布一下关程序的代码,专门针对上次的QQ刷屏代码:sety=getobject(“winmgmts:\\.\root\cimv2”)setx=y.execquery(“select*fromwin32_processwherename=’wscript.exe'”)foreachiinxi.terminat…

    2022年4月17日
    110
  • kmo检验和bartlett球形检验_轻松搞懂:球形压力容器如何焊接安装?[通俗易懂]

    kmo检验和bartlett球形检验_轻松搞懂:球形压力容器如何焊接安装?[通俗易懂]球形压力容器简称“球罐”,与其他形式的容器相比,其重量与体积之比最小,受力均匀,可以承受较高的压力,是工业中普遍应用的大容积定容储气罐。在冶金工厂中,球罐常用于贮存氧气、氮气及保护气体等,以供氧气炼钢、富氧鼓风、轧钢热处理炉及煤气置换等生产所需用气。球罐由球体壳板(分赤道带、下温带、下寒带、上温带、上寒带和极顶板)、支柱、操作平台及管件等组成。球罐按其结构型式分为桔瓣式和混合式两种。根据…

    2022年6月29日
    28
  • 膨胀卷积与IDCNN

    膨胀卷积与IDCNN

    2021年11月19日
    48
  • 博弈论学习笔记(六)纳什均衡之约会游戏与古诺模型

    博弈论学习笔记(六)纳什均衡之约会游戏与古诺模型可以将纳什均衡看成一种自我实施的协议,假设每个人都相信大家都会遵守协议,那么大家就都会遵守。纳什均衡是和领导力紧密联系的。在协调博弈中,领导力的作用就是促成人们达到某个特定均衡而不是其他均衡。尤其是某些缺乏领导的混乱状态,在这类博弈中领导力的作用举足轻重。–领导力的用武之地。举个简单的例子,如下表,很显然协调能够起到作用。αβα1,10…

    2022年10月15日
    2
  • iOS 在TabViewController中的一个ViewController跳转到另一种ViewController

    iOS 在TabViewController中的一个ViewController跳转到另一种ViewController

    2022年1月1日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号