>假设你有一个整数,你想把它转换成一个字节数组。在搜索了各个地方之后,我看到了两种方法,一种是仅移位,另一种是移位然后掩码。我理解移位部分,但为什么要遮盖?
例如,方案 1:
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;
有理由选择一个而不是另一个吗?
uint8
和uint32
不是C中的标准类型。 我假设它们分别表示 8 位和 32 位无符号整数类型(例如Microsoft编译器作为特定于供应商的扩展支持(。
无论如何。。。。
掩码更通用 - 它确保结果介于 0
和 0xFF
之间,而不管someByteArray
元素的实际类型或someInt
。
在这种特殊情况下,它没有区别,因为uint32
到uint8
的转换保证使用模算术(模0xFF + 0x01
等于十进制的0x100
或256
(。 但是,如果将代码更改为使用不同类型的变量或数组,则必须进行掩码以确保结果介于 0
和 255
(含(之间。
对于某些编译器,屏蔽会停止编译器警告(它有效地告诉编译器表达式产生一个介于 0
和 0xFF
之间的值,该值可以存储在 8 位unsigned
中(。 但是,其他一些编译器抱怨将较大类型转换为 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);