![]() |
1
23
因为有符号整数用 two's complement 表示法。
|
![]() |
2
11
安 Arithmetic right shift 移动时将保留标志 signed number :
相比之下,A Logical right shift 不会保留标志:
您的代码显然执行算术移位,因此符号位( MSB 重复。运营商(>>)所做的操作取决于所使用平台的实现细节。在大多数情况下,这是一个算术移位。
另外,请注意
|
![]() |
3
5
位移动负数是C中的实现行为。结果将取决于您的平台,理论上可能是完全无意义的。根据C99标准(6.5.7.5):
发生这种情况的原因很可能是因为编译器使用x86 sar(右移算术)指令来实现>>。这意味着符号扩展将发生-一旦值被转移,最重要的位将被复制到新的MSB中。从 intel manuals :
|
![]() |
4
3
当右移位且最左边的位为1时,一些平台/编译器将引入0,而一些将保留1并使新的最左边的位为1。这将保留数字的符号,使负数保持负数,称为符号扩展。
如果你尝试,你会发现不同
|
![]() |
5
1
符号扩展。 |
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 4 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 4 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 5 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 5 月前 |