我想知道如何宣布int以确保它是4字节或2字节短,无论在什么平台上。 C99对此有规定吗?
答案 0 :(得分:19)
C99对此没有太多说明,但您可以检查是否sizeof(int) == 4
,或者您可以使用固定大小类型,如uint32_t(32位无符号整数)。它们在stdint.h
答案 1 :(得分:8)
如果您使用的是C99并且需要给定大小的整数类型,请包含stdint.h
。它为无符号整数(正好为32位)定义uint32_t
类型,对于无符号整数至少为32位定义uint_fast32_t
,并通过快速定义在目标机器上为“快速”。 / p>
编辑:请记住,您也可以使用位域来获取特定数量的位(尽管它可能无法提供最佳性能,尤其是“奇怪”大小,并且大多数方面都是实现定义的):
typedef struct {
unsigned four_bytes:32;
unsigned two_bytes:16;
unsigned three_bits:3;
unsigned five_bits:5;
} my_message_t;
编辑2:还要记住,sizeof
会返回char
的数量。从理论上讲,char
不是8位,可能(尽管这些日子不太可能)。 char
中的位数在CHAR_BIT
中定义为limits.h
。
答案 2 :(得分:0)
在limits.h中尝试INT_MAX
常量
答案 3 :(得分:0)
你想要它是4个字节吗?
如果您只想查看在每个平台上编译的int的大小,那么您可以sizeof(int)
。
答案 4 :(得分:0)
sizeof (int)
将返回int
占用当前系统内存的字节数。
答案 5 :(得分:0)
我认为你需要的不仅仅是明显的sizeof (int) == 4
检查。可能你想要一些编译时检查。
在C ++中,您可以使用BOOST_STATIC_ASSERT
。
在C中,您可以通过编写尝试在失败时创建负大小的数组或尝试使用重新定义的案例创建switch
语句的代码来进行编译时断言。有关示例,请参阅此stackoverflow问题:Ways to ASSERT expressions at build time in C
答案 6 :(得分:0)
你可以使用sizeof(int),但你永远不能假设int有多大。 C规范没有对int的大小做任何假设,除了它必须大于或等于short的大小(必须大于或等于char的大小)。
int的大小通常与底层硬件对齐。这意味着int通常与一个字相同,其中一个字是从存储器总线取出的数据的功能大小(或者有时是CPU寄存器宽度)。它不必与单词相同,但我所指出的最早的音符应该是内存传输的首选大小(通常是一个单词)。
过去,有18位整数(PDP-8)和24位整数(PDP-15)。有36位字大小的架构(PDP-11),但我不记得他们的int大小是什么。
在Linux平台上,您可以查看
#include <sys/types.h>
获取每种类型的实际位数。
答案 7 :(得分:0)
昨晚我发现visual studio 2008不支持C99,它不支持stdint.h。但他们有自己的类型。这是一个例子:
#ifdef _MSC_VER
typedef __int8 int8_t;
typedef unsigned __int8 uint8_t;
typedef __int16 int16_t;
typedef unsigned __int16 uint16_t;
typedef __int32 int32_t;
typedef unsigned __int32 uint32_t;
typedef __int64 int64_t;
typedef unsigned __int64 uint64_t;
#else
#include <stdint.h>
#endif