我在弄乱数组,并注意到了这一点。例如:

int32_t array[];
int16_t value = -4000;

当我尝试将值写入int32数组值的上半部分和下半部分时,
array[0] = (value << 16) | value;

编译器会先将值转换为32位值,然后再进行移位和按位“或”运算。因此,不是在前半部分和后半部分中写入16位-4000,而是将上限值设为-1,将下限值设为-4000。

有没有办法对-4000的16位值进行OR运算,因此两半都为-4000?这不是一个很大的问题。我只是想知道是否可以做到。

最佳答案

当然,只需取消符号扩展名即可:

array[0] = (value << 16) | (value & 0xFFFF);

不用担心,编译器应该使用handle this reasonably

为了避免转移负数:
array[0] = ((value & 0xFFFF) << 16) | (value & 0xFFFF);

幸运的是,多余的无用&(比右侧的ojit_code还要多)。doesn't show up in the code

08-26 19:29
查看更多