c - (char) 在 ((unsigned char) ~0 >> 1) 之前的作用是什么?

标签 c binary char

我是 C 语言的初学者。

此代码执行 中的 SCHAR_MIN 的操作:

#include<stdio.h>

int main(void)
{
    printf("Minimum Signed Char %d\n",-(char)((unsigned char) ~0 >> 1) - 1);
    return 0;
}

我的理解是这样的: (unsigned char) 获取无符号字符“0000 0000”的位。 ~0 给出它的补码,即“1111 1111”,而 >> 1 将“1111 1111”左侧的“1”变为 0,因此将给出“0111 1111”。将“0111 1111”转换为整数将得到 127,这是最大的有符号字符。为了获得最小值,我们需要将 127 反转,因此我们将其乘以 - 得到 -127,而 - 1 给出 -128,这是最小值。如果我误解了什么,请告诉我。

问题:

这里(char)的作用是什么?就在 ((unsigned char) ~0 >> 1) 之前?代表什么?

最佳答案

  • 整数常量 0 的类型为 int,因此 ~0 会产生 int 值,例如0xFFFFFFFF(假设为 32 位)。这实际上是一个负值,对应于 2 的补码中的十进制 -1
  • 如果我们只对最低有效字节感兴趣,我们可以通过转换为 unsigned char 来屏蔽该字节,最后得到 0xFF。这样我们现在也可以放弃签名格式。
  • 然后 >> 运算符隐式地将我们的临时 unsigned char 操作数提升回 int,但由于值 0xFF (255) 适合一个 int,这就是我们得到的值。我们最终对有符号类型进行了位移位,但具有正值。
  • 0xFF >> 1 给出 0x7F = 127。事实上,整个 ((unsigned char) ~0 >> 1) 只是输入 127 的复杂方式。因为在所有具有 8 位字节的普通系统上,这就是我们得到的。
  • 现在,它已通过强制转换显式转换为 char。它仍然是相同的值 127。
  • - 给出 -127。一元 - 运算符隐式将结果提升回 int
  • -127 - 1 = -128

请注意,char 的符号是实现定义的。它也可能是未签名的,在这种情况下, Actor 阵容没有多大意义。无论如何,- 的隐式提升为我们提供了一个有符号的 int,因此转换为 char 没有任何效果。

参见Implicit type promotion rules有关整数提升的详细信息。

关于c - (char) 在 ((unsigned char) ~0 >> 1) 之前的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68284012/

相关文章:

java - 如何将字符更改为 boolean 值?

c - 如何将一个字符随机附加到字符串中?

c++ - 需要调试在docker中运行的混合 "C and C++"代码

c - libuv - 如何使用二进制协议(protocol)

C 绩效衡量

objective-c - 将 block 传递给需要函数指针的函数

java - 如何从 int 转换为 byte,然后使用位移运算符

sql - T-SQL 中的汉明权重/人口计数

jquery - 使用 jQuery Ajax 处理二进制数据?

c++ - 列表初始化的 char 数组是否仍然以 null 结尾?