如果我写这个声明:
unsigned ux = 2147483648;
(2 31 ),C编译器会将2147483648视为无符号或有符号值吗?
我听说常量值总是被视为签名,但我不认为这总是正确的。
答案 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 int
或unsigned long int
)。
顺便提一下,你的问题的标题目前是“关于类演员。(如果我写无符号ux = 2147483648(2到31日))”,但你的问题与类无关(在C中不存在) )或与演员表。我会编辑这个问题。