gpt4 book ai didi

c - 如何与 unsigned short int -1L 进行比较

转载 作者:太空宇宙 更新时间:2023-11-04 00:50:45 26 4
gpt4 key购买 nike

(-1L<1U) ? printf("A"):printf("B");    
(-1L<1UL) ? printf("C"):printf("D");
((short int)-1<1U) ? printf("E"):printf("F");
((short int)-1<1UL) ? printf("G"):printf("H");

这段代码在 gcc 编译器中运行后返回 BDEH....我无法理解为什么会这样。请有人指导。

最佳答案

这被标准称为“通常的算术转换”,适用于两种不同的整数类型作为同一运算符的操作数出现时的情况。

本质上是做什么的

  • 如果类型有不同的宽度(更准确地说是标准调用转换等级)然后它转换为更广泛的类型
  • 如果两种类型的宽度相同,除了非常奇怪的架构之外,未签名者获胜

无论类型如何,值 -1 的有符号到无符号转换始终会产生无符号类型的最高可表示值。

对于第 (1) 行,结果取决于 longint 的宽度。如果 intlong 窄,则所有 unsigned 值都适合 long,因此转换在 处停止>long 为 RHS。那么结果是“A”。如果它们的宽度相同,则双方继续转换为 unsigned long,结果为“B”。

对于 short 的特殊情况,还有一个称为“整数提升”的功能,可将所有比 int 窄的类型提升为整数。在第 3 行和第 4 行中,LHS 上的表达式首先转换为 int,这会保持值不变,然后 for (3) 转换为 unsigned int 和 (4) 到 unsigned long

据此,我的平台(linux、gcc)使用您的代码正确打印“ADFH”。

结果“BDEH”将出现在首先具有相同宽度的 longint 且范围为 unsigned 的平台上被int范围覆盖,即unsigned只是忽略了int的符号位。我不知道这样的平台仍然存在。

有些年我在 the anatomy of integer types 上写了一篇博文, 这应该仍然有效。

关于c - 如何与 unsigned short int -1L 进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19419768/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com