int32,int,int32_t,int8和int8_t之间的区别

lin*_*eak 90 c int declaration

int32_t最近在C程序中遇到了数据类型.我知道它存储了32位,但是没有int并且int32做同样的事情?

另外,我想char在程序中使用.我可以用int8_t吗?有什么不同?

总结一下:C中的int32,int,int32_t,int8和int8_t有什么区别?

Jer*_*fin 108

之间int32int32_t,(同样地之间int8int8_t)的区别很简单:C标准定义int8_tint32_t,但不定义任何命名int8int32-后者(如果存在的话)可能是从一些其他的头或库(最有可能早于C99 的加入int8_tint32_t.

平原int与其他平原有很大的不同.哪里int8_tint32_t每个都有指定的大小,int可以是任何大小> = 16位.在不同的时间,16位和32位都相当普遍(对于64位实现,它应该是64位).

另一方面,int保证在C的每个实现中都存在,其中int8_tint32_t不存在.尽管如此,这对您是否重要仍有待商榷.如果在小型嵌入式系统和/或较旧的编译器上使用C,则可能存在问题.如果您主要使用桌面/服务器计算机上的现代编译器,它可能不会.

哎呀 - 错过了一部分char.int8_t如果(并且仅当)您希望保证整数类型的大小恰好为8位,则可以使用而不是char.如果要存储字符,可能需要使用char.它的大小可以变化(就位数而言)但它保证恰好是一个字节.虽然有点奇怪:无法保证普通char是有符号还是无符号(并且许多编译器可以将其设置为一个,具体取决于编译时标志).如果您需要确保其已签名或未签名,则需要明确指定.

  • 你说"对于64位实现,(int)应该是64位".实际上,int在所有常见的64位平台上都是32位,包括Windows,Mac OS X,Linux和各种UNIX.一个例外是Cray/UNICOS,但它们现在已经过时了. (5认同)
  • @SamWatkins:是的,这就是为什么我小心翼翼地说"应该",而不是"是".该标准表示它是"体系结构建议的自然大小",(IMO)意味着在64位处理器上,它真的*应该是64位(但是,无论好坏,你通常都是正确的是不是).从更实用的角度来看,*在C89中的类型中具有32位类型是非常方便的,如果int是64位,则long也必须至少为64位,因此通常没有32位位类型. (5认同)
  • @barlop:是的。(C 和 C++ 都要求 char 的最小范围为 255 个值,因此它至少需要 8 位,但可以更多)。 (2认同)
  • 我总是认为一个字节恰好是8位,而不是从8位开始的任何地方 (2认同)

Sup*_*man 13

_t数据类型是stdint.h头文件中的typedef类型,而int是构建的基本数据类型.这使得_t仅在stdint.h存在时可用.另一方面,int保证存在.

  • 为什么要使用 _t 的? (2认同)

Nau*_*ann 5

永远记住,如果没有明确指定,'size' 是可变的,所以如果你声明

 int i = 10;
Run Code Online (Sandbox Code Playgroud)

在某些系统上,编译器可能会生成 16 位整数,而在其他一些系统上,它可能会生成 32 位整数(或在较新的系统上生成 64 位整数)。

在嵌入式环境中,这可能会导致奇怪的结果(尤其是在处理内存映射 I/O 或可能被认为是简单的数组情况时),因此强烈建议指定固定大小的变量。在遗留系统中,您可能会遇到

 typedef short INT16;
 typedef int INT32;
 typedef long INT64; 
Run Code Online (Sandbox Code Playgroud)

从 C99 开始,设计者添加了 stdint.h 头文件,该文件基本上利用了类似的 typedef。

在基于 Windows 的系统上,您可能会在 stdin.h 头文件中看到条目为

 typedef signed char       int8_t;
 typedef signed short      int16_t;
 typedef signed int        int32_t;
 typedef unsigned char     uint8_t;
Run Code Online (Sandbox Code Playgroud)

还有更多的东西,比如最小宽度整数或精确宽度整数类型,我认为探索 stdint.h 以获得更好的理解并不是一件坏事。

  • 你的代码有一个错字:`typedef short INT16;`,而不是`typedefs short INT16`。 (3认同)