如何解决(char) 在 ((unsigned char) ~0 >> 1) 之前的作用是什么?
我是 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)
之前?代表什么?
解决方法
这段代码可能是作为一种适用于所有有符号整数类型的模式出现的,因为对于 int
和更广泛的类型来说,强制转换是必需的,尽管在普通 C 实现中 char
不需要它。
考虑-(Type)((unsigned Type) ~0 >> 1) - 1)
。使用 <code>(<i>Type</i>)</code>
转换,我们得到了想要的否定结果。没有它,我们会得到一个错误的肯定结果:当 Type
是 int
,并且使用了二进制补码时,((unsigned <i>Type</i>) ~0 >> 1
是一个 unsigned int
,它的高位关闭而其他位打开.对此应用一元 -
会产生 unsigned int
,减法也是如此。所以结果将是正值,而不是所需的负值。使用强制转换 (Type)
,值会在一元 -
之前转换为有符号类型,因此会产生负值。
因此,此代码可能是通过对所有有符号整数类型使用模式 -(Type)((unsigned Type) ~0 >> 1) - 1)
产生的。尽管在普通 C 实现中 char
或 short
不需要强制转换,但它仍然存在,因为在模式中起草代码时进行了简单的替换。
这也解释了为什么强制转换为 char
而不是 signed char
:这是 long long int
、long int
、int
、{{ 的简单替换1}} 和 short
用于 char
,忽略 Type
与 char
的特殊处理。 (这在 signed char
比 char
窄的普通 C 实现中不是问题,但是使用 int
会使代码在 signed char
相同的异国 C 实现中工作宽度为 char
。)
检查您在其中找到的 int
文件可能会显示其他类型的相同模式。
- 整数常量
0
的类型为int
,因此~0
会产生一个int
值,例如 0xFFFFFFFF(假设为 32 位)。这实际上是一个负值,对应于 2 的补码中的小数-1
。 - 如果我们只对最低有效字节感兴趣,我们可以通过强制转换为
unsigned char
来屏蔽掉那个字节,以0xFF
结尾。这样我们也暂时放弃了签名格式。 - 然后
>>
运算符隐式地将我们的临时unsigned char
操作数提升回int
,但由于值0xFF
(255
) 适合在 { {1}},这就是我们得到的价值。我们最终对有符号类型进行了位移,但具有正值。 -
int
给出0xFF >> 1
= 127。实际上整个0x7F
只是输入((unsigned char) ~0 >> 1)
的一种复杂方式。因为在所有具有 8 位字节的普通系统上,这就是我们得到的。 - 现在通过强制转换显式转换为
127
。它仍然是相同的值 127。 -
char
给出-
。一元-127
运算符隐式将结果提升回-
。 -
int
。
请注意,-127 - 1 = -128
的符号是实现定义的。它也可能是未签名的,在这种情况下,演员表没有多大意义。 char
的隐式提升无论如何都会给我们一个签名的 -
,所以对 int
的强制转换没有任何效果。
有关整数提升的详细信息,请参阅 Implicit type promotion rules。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。