如何在C中声明32位整数


75

声明在任何平台上始终为4字节的整数类型的最佳方法是什么?我不用担心某些具有16位的设备或旧机器int


6
在C语言中,字节不必是8位,因此32位和4个字节可能意味着不同的含义。
KTC

1
@KTC:是否有任何平台以不同的方式定义字节?
Shiny先生和新安宇2009年

我也很想知道char!= 8bits和一个byte!= 8bits在哪里。char!= 8bits似乎还可以,因为我可以在自己未设计的系统或某些旧系统中使用char == 4bits,但是byte!= 8bits在哪里?
seg.server.fault,2009年

2
相当多的DSP等具有16位字符(C除了字符以外没有其他“字节”的概念-实际上,它是存储器的最小可寻址单元)。
史蒂夫·杰索普

1
根据您所处的寻址模式,我们其中的Honeyboxen仍然有6位和9位字节
。– user7116

Answers:


111

3
只是要注意,intN_t(和uintN_t)在标准方面是可选的。仅当系统具有符合要求的类型时才需要定义它。
KTC

30
那就是你想要的。如果代码确实需要32位int,并且您尝试在不支持它们的平台上进行编译,则希望编译器将其返回给开发人员。让它选择其他尺寸然后继续下去将是可怕的。
TED

12
请注意,标头“ <inttypes.h>”已明确记录为包括标头“ <stdint.h>”(这对于C标头并不常见),但是“ <inttypes.h>”标头在“ <stdint.h>”不可用的情况下可用,并且可能是可移植性的更好选择。在“ <stdint.h>”头是标准委员会的一项发明,并创造了让独立的C(相对于托管的实现-正常的)的实现只需要支持“ <stdint.h>”并不见得“ <inttypes.h>”太(这也意味着支持' <stdio.h>,否则就没有必要)。
乔纳森·莱夫勒

2
有没有办法将int32_t定义为无符号?
马修·赫伯斯特

5
@MatthewHerbst ,uint32_t
user545424 2014年

13

C并不十分关心整数类型的确切大小,C99引入了标头stdint.h,这可能是您最好的选择。包括它,您可以使用例如int32_t。当然,并非所有平台都可以支持。


11

在我看来,Corey的答案是“最佳”的正确答案,但实际上,一个简单的“ int”也可以使用(假设您忽略了16位int的系统)。在这一点上,太多的代码取决于int是32位的,因此系统供应商不会更改它。

(另请参见为什么在许多64位系统上long是32位以及为什么我们有“ long long”。)

但是,使用int32_t的好处之一是您不会使这个问题永久存在!


无需“忽略具有16位int的系统”,可以保证long在任何地方都至少为32位宽。
巴斯蒂安·莱纳德(BastienLéonard),2009年

3
是的,但是使用“ long”并不能解决初始请求,这恰好是32位。例如,在(至少是某些类型的)64位Linux上,long是64位-在实际实践中很可能会出现这种情况。
Brooks Moses

5

brg_types.h如果没有的话,您可以找回布莱恩·格拉德曼(Brian Gladman)的副本stdint.h

brg_types.h 将发现平台上各种整数的大小,并为常见的大小(8、16、32和64位)创建typedef。


实际上,在查看一些我发现的“ brg_types.h”时,该文件仅定义了无符号整数(例如,“ uint_8t”,“ uint_16t”,“ uint_32t”和“ uint_64t”)。OP需要带符号的整数。
swdev

5

您需要包含inttypes.h而不是,stdint.h因为stdint.h在某些平台(例如Solaris)上不可用,而在Linux等系统inttypes.h上将包含stdint.h您。如果包含它,inttypes.h则代码在Linux和Solaris之间更易于移植。

该链接解释了我在说什么: HP关于inttypes.h的链接

并且此链接具有一个表,该表显示了为什么不使用longint如果您打算在数据类型中存在一定数量的位。 关于可移植数据类型的IBM链接


1

如果stdint.h对您的系统不可用,请自行创建。我总是有一个名为“ types.h”的文件,其中所有带符号的/无符号的8位,16位和32位值都具有typedef。


0

也可以根据目标平台使用自动工具构建系统

它将查看stdint.h / inttypes.h是否存在,如果不存在,则将在“ config.h”中创建适当的typedef。


0

stdint.h是显而易见的选择,但不一定可用。

如果您使用的是可移植库,则可能已经提供了可移植的固定宽度整数。例如,SDL具有Sint32(S代表“符号”),而GLib具有gint32


0

C99或更高版本

使用<stdint.h>

如果您的实现支持2的补码32位整数,则必须定义int32_t

如果不是,则下一个最好的选择是int_least32_t实现支持的整数类型,该整数类型至少为32位,而不考虑表示形式(二进制补码,二进制补码等)。

还有一种int_fast32_t是至少32位宽的整数类型,选择它的目的是允许针对该大小要求的最快操作。

ANSI C

您可以使用long,由于标准规定的最小范围要求,保证至少32位宽。

如果您希望使用最小的整数类型来适合32位数字,则可以对以下宏中使用的预处理器语句进行定义<limits.h>

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.