是否在任何stdlib标头中定义了uint32,int32,uint64,int64之类的类型?


94

我经常看到使用诸如uint32,uint64之类的类型的源代码,并且想知道它们是否应由程序员在应用程序代码中定义,还是应在标准lib头文件中定义。

在我的应用程序源代码上包含这些类型的最佳方法是什么?

Answers:


135

C99 stdint.h定义了以下内容:

  • int8_t
  • int16_t
  • int32_t
  • uint8_t
  • uint16_t
  • uint32_t

并且,如果架构支持它们:

  • int64_t
  • uint64_t

也有其他各种整数typedef stdint.h

如果您没有C99环境,那么您应该提供自己的typedef并始终使用C99。

uint32uint64(即不带_t后缀)可能是特定应用。


16
这个答案是错误的。仅当实现中存在该大小的确切宽度类型(没有填充)时,以上所有内容才可用。即使没有,但是,所述类型int_leastNN_tuint_leastNN_tNN8,16,32,和64 必须始终存在。C99不允许没有至少64位整数类型的实现,因为long long要求它至少要那么大。
R .. GitHub停止帮助ICE,

@R ..:说“ POSIX stdint.h”而不是“ C99 stdint.h”是否准确?
亩太短了,

1
POSIX都stdint.h需要它们。
R .. GitHub停止帮助ICE,

1
@R ..,请为正确性编辑此答案?我花了一些时间来分析当前内容和您的评论的组合。
merlin2011 '17

SDL定义别名,例如typedef uint32_t Uint32;include / SDL_stdinc.h中的别名(如果您是SDL用户)
Et7f3XIV

10

这些整数类型都在 stdint.h


不是stdint.h特定于实现的吗?另请参阅此问题该问题
克里斯·弗雷德里克

3
查看该文件,我在注释中找到了“ ISO C99:7.18整数类型<stdint.h>”。stdint.h如果您尊重C99标准,我想您会明白。
菲利普斯

我在中找不到任何一个stdint.h。这将返回0个匹配:grep uint32 /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h | grep -v uint32_t
jww '16

1
@jww:以我为例,该文件包含#include "stdint-gcc.h",然后对该文件进行grepping即可得到定义。
Victor Zamanian '16

1
@jww是的,它们不存在。_t如上答案所示,只有标准的和应该定义的带有后缀。
Victor Zamanian '16

2

如果您使用的是C99,请添加stdint.h。顺便说一句,如果处理器支持它们,则有64位类型。


请在这方面引用一些内容。
BiGYAN

6
x86不支持64位数学运算,但具有64位类型。
R .. GitHub停止帮助ICE,

2
是的,它确实。它支持32位x 32位-> 64位乘法,64位/ 32位-> 32位商和32位余数除法,并具有带进位加法和带借位减法的指令。仅由于8086需要能够执行32位算术,它才能够执行64位算术。
迈克尔·莫里斯

还有一个uint128_tif __SIZEOF_INT128__定义为16或更大(GCC和兼容版本)。它在x86_64 / amd64计算机上可用,但处理器本身不支持它。只有Cray的寄存器大小为IIRC。
jww

0

发问者实际上询问的是int16(等)而不是(丑陋的)int16_t(等)。

没有标准头文件-在Linux的/ usr / include /文件夹中也没有标准头文件,没有“ _t”来定义它们。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.