#include<stdio.h>
int main()
{
printf("%x", -1<<1);
getchar();
return 0;
}输出:输出依赖于编译器。对于32位编译器,它将是fffffffe,而对于16位编译器,它将是fffe。
这是极客写给极客的
发布于 2021-04-04 21:08:41
-1是一个带符号的整数。根据C语言的正式定义,带负值的有符号整数的左移具有undefined behavior。这是一般规则的一部分,即签名操作在溢出时具有未定义的行为。符号位已设置,它必须移位,但没有空间可供其移动,因此它会溢出。
在实践中,几乎所有平台都对有符号整数使用two's complement表示,有符号整数的左移被视为内存中包含无符号整数。但是,请注意,编译器有时会利用这是未定义的行为的事实,以令人惊讶的方式进行优化。
-1是全位1,所以左移位删除了最上面的位,并在底部添加了一个0位。结果是二进制形式的111…1110。如果unsigned int是16位类型,则表示十六进制的fffe。如果unsigned int是32位类型,则为fffffffe。当该内存作为带符号的int读取时,无论采用哪种方式,该值都为-2。
指定的%x需要unsigned int作为参数。传递该类型的有符号版本是可以的:它被转换为无符号值。转换的结果是2^N -2,其中N是unsigned int中的位数:如上所述,如果为N=16,则为0xfffe,如果为N=32,则为0xfffffffe。
https://stackoverflow.com/questions/66939835
复制相似问题