int main(){
signed int a = 0b00000000001111111111111111111111;
signed int b = (a << 10) >> 10;
// b is: 0b11111111111111111111111111111111
signed short c = 0b0000000000111111;
signed short d = (c << 10) >> 10;
// d is: 0b111111
return 0;
}
假设
int
是 32 位,short
是 16 位,为什么
b
会被符号扩展,而 d
不会被符号扩展呢?我已经在 x64 上使用 gcc 编译器并使用 gdb 进行了测试。为了让
short
被符号扩展,我不得不像这样使用两个独立的变量: signed short f = c << 10;
signed short g = f >> 10;
// g is: 0b1111111111111111
signed short d = (c << 10) >> 10;
没有可观察的行为。但使用两个变量意味着存在一个序列点,那么就有了可观察的行为? - Jerry Jeremiahsizeof(c<<10)
,它会打印 int 类型的字节数,因此这实际上是整数提升。 - Jerry Jeremiah0b0001
类型符号表示法是使用标准的扩展,虽然被广泛支持但不是标准。 - Jonathan Leffler