C中的整数类型

Ray*_*oal 4 c int c99 c11

假设我希望编写一个C程序(C99或C2011),我希望它是完全可移植的,而不是绑定到特定的体系结构.

看来,我会那么想使从旧的整数类型(一刀两断int,long,short)和朋友使用 int8_t,uint8_t,int32_t等(可能使用了leastfast版本)中.

什么是返回类型main?或者我们必须跟上int?标准是否要求int

GCC-4.2允许我写

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

但我不能使用uint32_t,甚至int8_t因为我得到了

hello.c:3: warning: return type of ‘main’ is not ‘int’
Run Code Online (Sandbox Code Playgroud)

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

net*_*der 9

假设我希望编写一个C程序(C99或C2011),我希望它是完全可移植的,而不是绑定到特定的体系结构.

似乎我想要从旧的整数类型(int,long,short)和朋友那里彻底打破,并且只使用int8_t,uint8_t,int32_t等等(也许使用最小和最快的版本).

这两个粗体的肯定是矛盾的.这是因为无论是uint32_t,uint8_t和人可用,或者其实并没有实现定义(C11,7.20.1.1/3:精确宽度整数类型).

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

每例如,标准说,这两个shortint范围应至少 -32767到至少 32767.所以,如果要存储一个更大或更小的值,比如42000,你会使用一个long代替.


oua*_*uah 6

main标准要求返回类型为intC89,C99和C11.

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

例如:

int32_t main(void)
Run Code Online (Sandbox Code Playgroud)

if int32_t是typedef int.