我是 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/