和 0xff 做与 / & 0xff / AND 0xff 的作用是什么?

您所在的位置:网站首页 0x00和0xff 和 0xff 做与 / & 0xff / AND 0xff 的作用是什么?

和 0xff 做与 / & 0xff / AND 0xff 的作用是什么?

2024-07-15 21:54| 来源: 网络整理| 查看: 265

和 0xff 做与 / & 0xff / AND 0xff 的作用是什么?

在代码开发过程中,我们可能会看到这样的代码,在拿到一个数后,对其低N位进行和全1的与运算,即类似于:

foo = foo & 0xff;

将foo的低八位和0xff做与运算。从逻辑上讲,1 & 1 == 1, 0 & 1 == 0,这一运算没有对foo作任何改变,那么这一操作的意义是什么呢?

对于这一问题的问题,可根据使用的情形,分为三种情况。

1. foo为8-bit无符号数 -> 操作无意义

对于单个8位无符号数,其原码与补码相同,如上文所述,这一操作没有对该数做任何改变,是无意义操作。

2. ⭐ foo为8-bit有符号数 -> 避免隐式符号扩展 补码规则

对于有符号数,尤其是负数,在计算机中存储时要遵循补码规则,以8-bit有符号数为例:

正数与0的补码为其自身(原码)。 负数的补码为其绝对值的原码,按位取反后加1,符号位为1。 没有-0,-0编码对应最小值,如1000 0000B 对应 -128(128原码为1000 0000B,但其不在表示范围内)

通过一个简单的运算回顾补码规则 计算一个减法运算:

-75 - 30 = -75 + (-30) = -105

75 == 16*4 + 11 == 0x4b = 0100 1011B 按位取反:1011 0100B 加1:1011 0101B,即为-75的补码。 30 == 16*1 + 14 == 0x1e = 0001 1110B 按位取反:1110 0001B 加1:1110 0010B,即为-30的补码 二者非符号位相加,得: 1011 0101 1110 0010 + 1001 0111 1001 0111是多少呢? 减1:1001 0110B 按位取反:0110 1001B 即为0x69, 6 * 16 + 9 = 105 加上符号位,我们得到的结果即为-105 隐式符号扩展(非专业名词,是从英文论坛直译来的)

我们知道,计算机以补码的形式存储有符号数,当最高位为1时,意味着其为负数。这会带来一个小小的隐患:

当我们把一个8-bit有符号数扩展到16-bit时,其符号位会被如何处理?

答:高八位会被填充为全1,这会导致该数的补码发生变化,即新的16-bit数不等于原8-bit数。

一个简单的实验 #include #include int main() { uint8_t byte = 0x01; int8_t foo = -127; int16_t out1 = (int16_t)foo; uint16_t out2 = (uint16_t)foo; uint16_t out3 = (byte


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3