将int转换为字节数组时屏蔽还是不屏蔽?

时间:2015-12-05 01:18:26

标签: c arrays bit-manipulation

假设您有一个整数,并且希望将其转换为字节数组。在搜索了不同的地方后,我发现了两种方法,一种是仅移位,一种是移位然后是掩码。我理解变化的部分,但为什么要掩盖?

例如,方案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;

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

1 个答案:

答案 0 :(得分:1)

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

无论如何....

屏蔽更为通用 - 它确保结果介于00xFF之间,无论元素someByteArraysomeInt的实际类型如何。

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

对于一些编译器,掩码会停止编译器警告(它有效地告诉编译器该表达式产生的值在00xFF之间,可以存储在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);