保证C数据类型的最小大小/范围
我找到了这个问题的不同答案,我知道必须有一个确定的答案。 C中四种主要数据类型的最小分配内存大小是多少? int
, double
, float
和char
是我的想法。 signed
或未unsigned
类型是否以任何方式改变大小?
你可以使用sizeof(variable)
:
以我在本地计算机上运行此示例为例:
sizeof (char) = 1 sizeof (double) = 8 sizeof (float) = 4 sizeof (int) = 4 sizeof (long) = 4 sizeof (long long) = 8 sizeof (short) = 2 sizeof (void *) = 4
注意:您获得的值可能由OS /编译器/ CPU架构决定。
ANSI C为各种原始数据类型定义了以下大小。
- 烧焦
- 最小签名范围:-128 .. 127
- 最小无符号范围:0 .. 255
- 可以更大,但无论大小,sizeof(char)== 1
- sizeof(unsigned char)== 1
- 短
- 最小签名范围:-32768 .. 32767
- 最小无符号范围:0 .. 65535
- 可以更大
- 长
- 最小签名范围:-2147483648 .. 2147483647
- 最小无符号范围:0 .. 4294967295
- 可以更大
- INT
- 必须具有与短路相同的范围
- 可以具有相同的范围作为长
- 不能有一个大于长的范围
- short <= int,int <= long,但short
浮点数和双精度数有更多规则,但一般来说,浮点数的范围是<=双精度范围(对于现代机器---浮点数是4个字节,双精度数是8)。
标准只保证char
为1
字节。
其余类型具有实现定义的大小。
签名或未签名类型是否以任何方式改变大小?
不会。它只会影响所持数据的范围。 有关短数据类型(2个字节),请参见下面的示例。
- 签署-32,768至+32,767
- 无符号0到65,535
这是一个很好的问题。 我推荐你到C99 6.2.5。 维基百科C数据类型文章很好。
- char足够大,可以存储基本执行字符集的任何成员。 它不是一个字节(由8位定义),并且一个好的思考方式是它是最小的可寻址/可分配单元(MAU),正如你在你的问题中写的那样,但在某些系统上不是一个字节。
- 整数有点有趣。 我认为它们应该至少保持2 ^ 15-1(16位),但我目前在C99中找不到它。 在标准的较新版本中,我认为它们实际上被定义为至少32位,因为很多人都认为它们是。 但总的来说,您必须假设它们是根据MAU(
sizeof()
)定义的实现。 不仅如此,规范还允许填充比特(例如用于纠错)。 因此,在8位字符系统上,如果sizeof(int)
为4,则最大int不一定是2 ^ 31-1,因为规范允许其中一些位用作“填充”。 因此,唯一可以确定的方法是使用limits.h
! -
float / double也是实现定义的,尽管double总是大于float。 通常这些实现由与IEEE-754规范兼容的实现定义(分别需要至少32位和64位),但C99不需要它。 但是如果你的字符大小是32位,那么sizeof(float)可能只有1。
-
签名/未签名不会更改大小。
由于这些原因,
是C语言最重要的新增function之一。 在此之前,编写跨平台代码非常困难。
写一个小测试程序,亲眼看看:
int main(int argc, char* argv[]) { printf("%d\n", sizeof(char) ); printf("%d\n", sizeof(int) ); printf("%d\n", sizeof(unsigned char) ); printf("%d\n", sizeof(unsigned int) ); printf("%d\n", sizeof(double) ); printf("%d\n", sizeof(float) ); return 0; }
“int,float,double”与平台有关(16,32,64)。 标志不影响大小,只解释。