微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决(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> 转换,我们得到了想要的否定结果。没有它,我们会得到一个错误的肯定结果:当 Typeint,并且使用了二进制补码时,((unsigned <i>Type</i>) ~0 >> 1 是一个 unsigned int,它的高位关闭而其他位打开.对此应用一元 - 会产生 unsigned int,减法也是如此。所以结果将是正值,而不是所需的负值。使用强制转换 (Type),值会在一元 - 之前转换为有符号类型,因此会产生负值。

因此,此代码可能是通过对所有有符号整数类型使用模式 -(Type)((unsigned Type) ~0 >> 1) - 1) 产生的。尽管在普通 C 实现中 charshort 不需要强制转换,但它仍然存在,因为在模式中起草代码时进行了简单的替换。

这也解释了为什么强制转换为 char 而不是 signed char:这是 long long intlong intint、{{ 的简单替换1}} 和 short 用于 char,忽略 Typechar 的特殊处理。 (这在 signed charchar 窄的普通 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 举报,一经查实,本站将立刻删除。