如何签名在C ++中将11位数扩展为32位数?
我有以下功能,但它没有按预期返回正确的符号扩展名:
unsigned int signExtend11to32ui(int i) {
int mask = 2047; // 0x7FF or 0000 0111 1111 1111
return static_cast<unsigned int>(static_cast<int>(i & mask));
}
以下函数适用于16位到32位的符号扩展:
unsigned int signExtend16to32ui(short i) {
return static_cast<unsigned int>(static_cast<int>(i));
}
答案 0 :(得分:2)
由于左右移位是C ++中的算术运算,因此您可以将整数转换为int的最高位然后返回:
std::int32_t i = 2047;
i = (i << 21) >> 21;
这会将-1加到i