gpt4 book ai didi

c++ - 是否存在我遗漏的运算符优先级问题? unsigned short 与 inverse 的比较失败

转载 作者:行者123 更新时间:2023-12-01 12:44:01 31 4
gpt4 key购买 nike

我可以想到为什么这行不通,但我不明白为什么我尝试过的许多解决方法都不起作用。下面是我正在尝试编写的代码示例。意图应该是显而易见的,但是使用 GCC 7.4.0 编译 Windows 32 位、Visual C 32 位和 Visual C 64 位以及 C++ 模式下的相同编译器,所有这些都会产生相同的答案,所以我确定这不仅仅是编译器错误。
代码是:

unsigned short usAlgo = 0x0001;
unsigned short usNotAlgo = ~usAlgo;

if ( usAlgo == ~usNotAlgo )
printf("Pass\n");
else
printf("Fail\n");
在我尝试过的所有编译器上,此代码都会打印“失败”。通过轻微的重新排列:
unsigned short usCheck = ~usNotAlgo;
if ( usAlgo == usCheck )
它打印“通过”。我原以为 usCheck 无论如何都会得到优化,那么为什么会有所不同呢?
我尝试了各种不起作用的解决方法,包括位掩码、括号、使它们有符号值等:
if ( usAlgo == (~usNotAlgo) & 0xffff )
或者
if ( (unsigned int)(usAlgo) == ~(unsigned int)(usNotAlgo) )
我想我已经发现这两个中的第一个失败了,因为“==”的优先级高于“&”,但我一生都无法理解为什么这么简单:
if ( usAlgo == ~usNotAlgo )
失败。
查看编译器输出并没有真正帮助,除了我可以看到“真实”比较最终是:
if( 0x00000001 == 0xFFFF0001 )
这意味着,无符号短整型(0xFFFE)首先被提升为无符号整型(0x0000FFFE),然后被否定。 (这就是为什么我们认为让它们签名可能会扩展到 0xFFFFFFFE。
我显然知道如何解决这个问题,但我需要了解为什么。
有任何想法吗?
[编辑:语法]

最佳答案

如您所见,usNotAlgo被提升为类型 int之前~运算符被应用。一般来说,任何时候小于 int 的类型用于表达式中,首先提升为 int .
这在 C standard 的第 6.3.1.1p2 节中有所记录。 :

The following may be used in an expression wherever an int orunsigned int may be used:

  • An object or expression with an integer type (other than int or unsigned int) whose integer conversion rank is lessthan or equal to the rank of int and unsigned int.
  • A bit-field of type _Bool, int, signed int,or unsigned int.

If an int can represent all values of the original type (asrestricted by the width, for a bit-field), the value isconverted to an int; otherwise, it is converted to anunsigned int. These are called the integer promotions. Allother types are unchanged by the integer promotions.


关于 ~ 的第 6.5.3.3p4 节运营商特别说:

The result of the ~ operator is the bitwise complement of its (promoted) operand (that is,each bit in the result is set if andonly if the corresponding bit in the converted operand is not set).The integer promotions are performed on the operand, and theresult has the promoted type. If the promoted type is an unsignedtype, the expression ~E is equivalent to the maximum valuerepresentable in that type minus E.


这可以通过将结果转换回 unsigned short 来解决。屏蔽额外的位:
if ( usAlgo == (unsigned short)~usNotAlgo )

关于c++ - 是否存在我遗漏的运算符优先级问题? unsigned short 与 inverse 的比较失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62686963/

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