c - 将int转换为字节数组时是否屏蔽?

标签 c arrays bit-manipulation

假设你有一个整数,你想把它转换成一个字节数组。在搜索了各个地方之后,我看到了两种方法,一种是仅移位,一种是移位然后掩码。我理解移动部分,但为什么要屏蔽?

例如场景一:

uint8 someByteArray[4];
uint32 someInt;

someByteArray[0] = someInt >> 24;
someByteArray[1] = someInt >> 16;
someByteArray[2] = someInt >> 8;
someByteArray[3] = someInt;

场景 2:

uint8 someByteArray[4];
uint32 someInt;

someByteArray[0] = (someInt >> 24) & 0xFF;
someByteArray[1] = (someInt >> 16) & 0xFF;
someByteArray[2] = (someInt >> 8) & 0xFF;
someByteArray[3] = someInt & 0xFF;

是否有选择其中一个的理由?

最佳答案

uint8uint32 不是 C 中的标准类型。我假设它们分别表示 8 位和 32 位无符号整数类型(例如 Microsoft 编译器支持的作为特定于供应商的扩展)。

无论如何....

屏蔽更通用 - 它确保结果在 00xFF 之间,而不管元素 someByteArray 的实际类型code>someInt.

在这种特殊情况下,它没有区别,因为 uint32uint8 的转换保证使用模运算(模 0xFF + 0x01 等于 0x100256 (十进制)。但是,如果您的代码更改为使用不同类型的变量或数组,则必须进行屏蔽以确保结果介于 0255(含)之间。

对于某些编译器,屏蔽会停止编译器警告(它有效地告诉编译器表达式产生的值介于 00xFF 之间,可以存储在 8 位中未签名)。但是,其他一些编译器提示将较大类型转换为 8 位类型的行为。正因为如此,您有时会看到第三种变体,它真正展示了“腰带和吊带”的心态。

uint8 someByteArray[4];
uint32 someInt;

someByteArray[0] = (uint8)((someInt >> 24) & 0xFF);
someByteArray[1] = (uint8)(someInt >> 16) & 0xFF);
someByteArray[2] = (uint8)((someInt >> 8) & 0xFF);
someByteArray[3] = (uint8)(someInt & 0xFF);

关于c - 将int转换为字节数组时是否屏蔽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34100138/

相关文章:

C main() 函数可以是静态的吗?

c - 使用 sigwait 处理 SIGQUIT

c - 既不是参数也不是指针

arrays - 将数值数组转换为字符串元胞数组

arrays - 如何在bash中创建列表(或类似列表)数组?

java - 如何知道 boolean 值是否根本没有被设置(或取消设置)?

bit-manipulation - x XOR (x/2) 的逆函数是什么?

c - 从 int 到 main()::colors 的转换无效?

c - 如何合并共享库?

matlab - 将零填充到二进制数中特定位置的命令?