c - 带符号字符的按位运算

标签 c bit-manipulation

我发现一个程序可以打印有符号字符的最大值和最小值。虽然我们在类里面学过位运算,但我不明白所有运算符放在一起是什么时候。

 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/

相关文章:

c - C中的这段代码是什么意思?

c - 二维数组的指针数组的最大大小?

c - 使用初始化器设置多维数组的所有边界

c - 为什么 (void)0 会停止 "statement has no effect"警告?

c++ - 按位与 : why do I get this behaviour?

c - GNU 链接器、-l 标志和隐式规则

c++ - 仅使用位掩码确定偏移量

bit-manipulation - 求一个数的平方

c++ - 为什么小于 4 字节的整数类型的位操作会出现异常?

c - 在 C 或 CUDA 中使用 << 求幂