我有一个关于在C中使用数字后缀的问题。
示例:
long long c;
变量c是long long类型。为了发起它的价值,我(通常)
c = 12;
当这样做时,编译器将c识别为long long类型。
然后,如果我这样做
printf("%d",sizeof(c));
结果是8 - 当然是64位。所以编译器会记住c是long long类型。
但我已经看到了一些例子,我需要通过这样做来强制类型很长
c = 12LL
为什么?
答案 0 :(得分:3)
你将变量c声明为long long,所以它是一个long long int。变量的类型不依赖于其值;相反,c的可能值范围取决于c的类型。看到? (哈哈)
另一方面:对于整数常量/文字,类型由其值和后缀(如果有)确定。 12没有前缀,所以它是一个十进制常量。它没有后缀,这意味着它有一个int类型,因为12保证在它的长范围内。 12LL没有前缀,所以它也是一个十进制常量。它的后缀为LL,这意味着它有一个long long int类型。将12分配给变量c是安全的,因为int可以安全地转换为long long int。
希望有所帮助。
答案 1 :(得分:0)
long long c;
c = 12;
c
的类型为long long
,但12
的类型为int
。将12
分配给long long
对象c
时,会先将其转换为long long
,然后再分配到c
。
c = 12LL;
执行完全相同的赋值,只需要先隐式转换它。两个赋值都是等价的,没有理智的编译器会有所作为。
请注意,一些编码指南,例如MISRA(用于汽车嵌入式代码),要求分配给无符号类型的常量后缀为U
:
示例,在C中,两个分配(此处为unsigned int x;
)都是等效的:
x = 0; /* non-MISRA compliant */
x = 0U;
但是MISRA需要第二种形式(MISRA-C:2004,规则10.6)。