我在弄乱数组,并注意到了这一点。例如:
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。