“unsigned ux = 2147483648;”中的常量类型

时间:2012-02-23 07:10:15

标签: c constants unsigned signed

如果我写这个声明:

unsigned ux = 2147483648;

(2 31 ),C编译器会将2147483648视为无符号或有符号值吗?

我听说常量值总是被视为签名,但我不认为这总是正确的。

1 个答案:

答案 0 :(得分:4)

未填充的十进制常量(如2147483648)的值取决于常量的值,预定义类型的范围,在某些情况下取决于您正在使用的C标准的版本。 / p>

在C89 / C90中,类型是第一个:

  • int
  • long int
  • unsigned long int

适合它。

在C99及更高版本中,它是第一个:

  • int
  • long int
  • long long int

适合它。

您没有告诉我们您使用的是哪种实施方式,但如果您的系统中long int为32位,那么2147483648类型为unsigned long int -C99编译器,如果您有C99或更高版本的编译器,则(签名)long long int

但在你的特殊情况下:

unsigned ux = 2147483648;

没关系。如果常量是unsigned int类型,那么它已经是正确的类型,并且不需要转换。如果类型为long long int(因为它必须在C99或更高版本中,给定32位long),则必须将该值从该类型转换为unsigned。从签名类型到无符号类型的转换已经明确定义。

因此,如果unsigned的宽度足以表示值2147483648,那么这就是将存储在ux中的值。如果不是(例如,如果unsigned int是16位),那么转换将导致0存储在ux中。

您可以通过为其添加后缀来对常量类型进行一些控制。例如,2147483648UL保证属于某种无符号类型(可以是unsigned intunsigned long int)。

顺便提一下,你的问题的标题目前是“关于类演员。(如果我写无符号ux = 2147483648(2到31日))”,但你的问题与类无关(在C中不存在) )或与演员表。我会编辑这个问题。