【发布时间】:2016-09-25 07:47:46
【问题描述】:
我找到了一个打印有符号字符的最大值和最小值的程序。虽然我们在课堂上学过位运算,但我不明白什么时候把所有的运算符放在一起。
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,我以为二进制补码加一呢?
【问题讨论】:
-
这是“实现未定义的行为”,即它依赖于实现定义的行为,但实现可能会定义它是未定义的行为。如果您的目标是打印
char的最大值和最小值,请执行#include <limits.h>并打印出CHAR_MIN和CHAR_MAX
标签: c bit-manipulation