字节与位运算(附带题目)

本文探讨了位运算中不同类型变量间的操作,特别是在处理char到short类型转换时的方法。通过实例说明了如何将两个char类型的值合并成一个short类型值,并讨论了在不同字节序系统中的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
首先分析题目,a,b皆为1一个字节(char),val为2个字节(short)
ps:int为4字节,8个2进制位为一个字节=2个16进制位;

那么short类型刚好能放下2个char类型的数据。那么这里就会有一个问题,我需不需要类型转换呢?
答案是不需要的,这里是位运算,类型在地址中存放的时候,只是告诉我这个类型需要占用多大的地址空间。

所以答案是val=a<<8|b;;把a=0x01向左(高位)偏移8位,即0x0100,因为低8位会自动补0;然后再或上b=0x02,因为0或任何数为任何数,并且会放在低8位,不要问我为什么,就是从低地址开始放~

有人就会问 ,为什么这里小端字节序(LSB)没有管他呢? 因为这个小端字节序在这里是迷惑我们的;LSB只是负责数据在内存的储存的顺序,和大端字节序(MSB)相对应。

嗷 后来有个朋友说我这个不对 ,应该是val=a<<8|(b&0xff),我想这不是一样吗。为此我还专门试一下,如图:
在这里插入图片描述
实践是检验真理的唯一标准,其实这两个是一样的。。至少在这个题目里面是的;
但是这个b&0xff真的没有必要吗?我们再来想一想,如果这个b是short或者int类型呢?
在这里插入图片描述
First;我们先看short b ,虽然我定义是2个字节但是我只赋值了一个字节。而 b&0xff 了还是0x02再和a=0x0100 或。和题目的一样。
Second;我们再看 short c ,我赋值了2个字节 ,再和a=0x0100或。 如果没有把c 与上0xff,就会发现区别。第一个0x0100或运算0x1234 得到0x1334;而第二个就是0x0100或运算0x0034得到0x0134。

So that 我再想一想,这个“&0xff” 到底是什么意思呢?我再实验一次;
在这里插入图片描述
就会发现 ,只会取最低的8位,那其他的那些位去哪了? 那我再取指针来试一试他们到底在哪?
在这里插入图片描述
我们会发现 ,他们还放内存里面的,就会发现这里的储存顺序就是倒着的,ptr[0]指向低地址,发现是0x78,就是数据的低位放在内存中低地址 ,代表我这个系统是小端字节序LSB。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值