我发现一个程序可以打印有符号字符的最大值和最小值。虽然我们在类里面学过位运算,但我不明白所有运算符放在一起是什么时候。
int main(void)
{
printf("Minimum Signed Char %d\n",-(char)((unsigned char) ~0 >> 1) - 1);
printf("Maximum Signed Char %d\n",(char) ((unsigned char) ~0 >> 1));
}
例如,我知道 ~ 翻转这些位并 >> 将它们移到右侧。所以我相信 ~0 >> 1,翻转所有位并将它们移到正确的一位。但为什么我们要减1,我以为补码会加1呢?
最佳答案
(unsigned char) ~0
的所有位均为 1(最大正unsigned char
)>> 1
关闭最高位,用于符号(最大正signed char
)-(char)
将该值否定为char
(注意:应该是signed char
)- 1
用于当前负值,因为在二进制补码中,最负值的大小比最大正值大 1(因为零值的符号位关闭,并且二进制补码中没有“负零”)
关于c - 带符号字符的按位运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39681675/