C和数字后缀

时间:2014-08-13 16:23:19

标签: c

我有一个关于在C中使用数字后缀的问题。

示例:

long long c;

变量c是long long类型。为了发起它的价值,我(通常)

c = 12;

当这样做时,编译器将c识别为long long类型。

然后,如果我这样做

printf("%d",sizeof(c));

结果是8 - 当然是64位。所以编译器会记住c是long long类型。

但我已经看到了一些例子,我需要通过这样做来强制类型很长

c = 12LL

为什么?

2 个答案:

答案 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)。