C中的整数类型

时间:2013-02-12 14:48:07

标签: c int c99 c11

假设我希望编写一个C程序(C99或C2011),我希望它是完全可移植的,并且不依赖于特定的架构。

似乎我想要从旧的整数类型(intlongshort)和朋友那里彻底中断并仅使用 int8_tuint8_tint32_t等等(可能也使用leastfast版本。)

main的返回类型是什么?或者必须我们与int一起罢工?标准是否要求int

GCC-4.2允许我写

#include <stdint.h>
#include <stdio.h>
int32_t main() {
    printf("Hello\n");
    return 0;
}

但我无法使用uint32_t甚至int8_t因为我得到了

hello.c:3: warning: return type of ‘main’ is not ‘int’

这是因为typedef,毫无疑问。看起来这是一个我们不得不使用未指定大小类型的情况,因为除非我们将返回类型留给目标体系结构,否则它不是真正可移植的。这种解释是否正确?在代码库中“只有一个”普通的int似乎很奇怪,但我很乐意务实。

2 个答案:

答案 0 :(得分:9)

  

假设我想写一个我想成为的C程序(C99或C2011)   完全可移植并且不依赖于特定的架构。

     

似乎我想要与旧的彻底决裂   整数类型(int,long,short)和朋友,只使用int8_t,   uint8_t,int32_t等(也许使用最少和最快   版本)。

这两个大胆的肯定是矛盾的。这是因为uint32_tuint8_t和al是否可用实际上是实现定义的(C11,7.20.1.1/3:精确宽度整数类型)。

如果您希望您的程序真正可移植,则必须使用内置类型(intlong等)并坚持C标准中定义的最小范围(即:C11,5.2.4.2.1:整数类型的大小),

例如,标准规定shortint的范围应从至少 -32767到至少 32767.所以如果你想要存储更大或更小的值,比如42000,你可以使用long代替。

答案 1 :(得分:6)

标准要求{C},C99和C11中main的返回类型为int

现在,精确宽度整数类型是整数类型的别名。因此,如果您使用int的正确别名,它仍然有效。

例如:

int32_t main(void)

如果int32_tint的typedef。