在C语言中,如何比较无符号整型和字面量?

3

我正在进行以下比较:

uint32_t value = 1000;

if(value < 100)
{
  // do something
}

在这种情况下,什么被转换成什么?'value'被转换为整数吗?100被转换成整数还是无符号整数?

详细:C将1000标识为_常量_,而非_字面值_ - 或许您在想另一种语言?到目前为止,C的_字面值_(字符串和复合)可以取其地址,但1000则不行。 - chux - Reinstate Monica
小问题:没有发生_casting_。但1000被_coverted_了。 - chux - Reinstate Monica
2个回答

6
首先,所有数字常量都有一个类型。在常量100的情况下,由于它是十进制的,没有后缀,并且可以适合int的范围内,该常量的类型为int
比较的方式由通常算术转换所决定。具体来说,整数类型的转换规则在C标准的第6.3.1.8p1节中指定如下:
在两个操作数上执行整数提升后,对提升后的操作数应用以下规则:
  • 如果两个操作数具有相同的类型,则不需要进一步转换。
  • 否则,如果两个操作数都具有带符号整数类型或都具有无符号整数类型,则具有较小整数转换等级的操作数将转换为具有更高等级的操作数的类型。
  • 否则,如果具有无符号整数类型的操作数的等级大于或等于另一个操作数的类型的等级,则具有带符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型。
  • 否则,如果具有带符号整数类型的操作数的类型可以表示无符号整数类型的所有值,则具有无符号整数类型的操作数将转换为具有带符号整数类型的操作数的类型。
  • 否则,两个操作数都转换为与具有带符号整数类型的操作数的类型相对应的无符号整数类型。
假设您的平台上的一个int是32位,那么uint32_t就与unsigned int相同,因此您在表达式中使用了一个有符号类型和一个无符号类型相同大小。在这种情况下,上面的第三个要点适用,即值100(其类型为int)被转换为unsigned int,然后比较这些值。
在这种情况下,值100也在unsigned int的范围内,因此实际值不需要转换。如果它是-100之类的值,那么该值就不在unsigned int的范围内,这意味着该值将被转换为在该范围内。再次假设32位int,该值将为2的32次方减去100。

0

如果两个整数表达式与您提供的示例具有相同的等级,假设类型uint32_t是类型unsigned int的别名,则有符号类型将转换为无符号类型。也就是说,具有有符号int类型的整数文字100将转换为无符号int类型。

来自C标准(6.3.1.1布尔值、字符和整数)

- 任何无符号整数类型的等级应等于相应有符号整数类型(如果有)的等级。

并且(6.3.1.8通常算术转换)

否则,如果具有无符号整数类型的操作数的等级大于或等于另一个操作数类型的等级,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接