C数据类型的保证最小大小/范围

3

我注意到在这个问题上答案不尽相同,但必定存在一个权威的答案。以下是C语言四种主要数据类型的内存最小分配大小:整型int、双精度浮点型double、单精度浮点型float以及字符型char。那么signedunsigned是否会影响它们的大小呢?


6
变量的大小。 - Darren
1
这个问题不是重复的关闭原因,应该重新打开。 - Klas Lindbäck
1
@Steven:http://en.wikipedia.org/wiki/C_data_types 似乎有你需要的信息。 - Klas Lindbäck
一个关于C++数据类型(int、long等)大小的非常相关的问题 [size of int, long, etc]。 - Bo Persson
6个回答

9

ANSI C定义了各种原始数据类型的以下大小。

  • char
    • 最小有符号范围:-128 .. 127
    • 最小无符号范围:0 .. 255
    • 可以更大,但无论大小如何,sizeof(char) == 1
    • sizeof(unsigned char) == 1
  • short
    • 最小有符号范围:-32768 .. 32767
    • 最小无符号范围:0 .. 65535
    • 可以更大
  • long
    • 最小有符号范围:-2147483648 .. 2147483647
    • 最小无符号范围:0 .. 4294967295
    • 可以更大
  • int
    • 必须至少与short具有相同的范围
    • 可以与long具有相同的范围
    • 不能具有比long更大的范围
    • short <= int,并且int <= long,但short < long

浮点数和双精度浮点数还有更多规则,但通常情况下,float的范围<= double的范围(对于现代机器而言——float为4字节,double为8字节)。


2

根据标准,只有char保证是1字节。
其它类型的大小是由实现定义的。


1
确实如此,但请注意1个字节可能不是一个八位组。在某些平台上,字节宽度为32位。 - Patrick Schlüter

2

有符号或无符号类型会以任何方式改变大小吗?

不会。它只影响所保存数据的范围。请参见下面的示例,其中为短数据类型(2字节)。

  • 有符号 −32,768 到 +32,767
  • 无符号 0 到 65,535

1

这是一个很好的问题。我建议您参考C99 6.2.5。Wikipedia C数据类型文章也不错。

  • char足够大,可以存储基本执行字符集中的任何成员。它不是一个字节(由8位定义),关于它的一个很好的思考方式是它是最小可寻址/可分配单元(MAU),正如你在问题中所写的,但在某些系统上它不是一个字节。
  • int有点有趣。我认为它们应该至少容纳2^15-1(16位),但我目前在C99中找不到它。在新版本的标准中,我相信它们实际上被定义为至少32位,因为很多人都这样假设。但总的来说,你必须假设它们是以MAUs(sizeof())为单位的实现定义。不仅如此,规范还允许填充位(例如用于纠错)。因此,在一个8位字符系统上,如果sizeof(int)是4,则最大的int不一定是2^31-1,因为规范允许其中一些位用作“填充”。因此,唯一确定的方法是使用limits.h
  • float / double也是实现定义的,尽管double总是比float大。通常,这些被实现定义为与IEEE-754规范兼容(分别需要至少32和64位),但C99不要求。但如果你的char大小为32位,则sizeof(float)可能只有1。

  • signed / unsigned不会改变大小。

由于这些原因,<stdint.h> 是 C 语言中最重要的新添加之一。在此之前,编写跨平台代码非常困难。

0

你可以使用 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

注意:您获得的值可能由操作系统/编译器/CPU架构决定。

3
尺寸大小是与平台和编译器相关的。 - Toon Krijthe
@Toon - 是的,他仍然可以使用sizeof运算符自行确定它们。 - Darren
是的,sizeof 是安全的。但是固定值可能会让人感到困惑。 - Toon Krijthe
1
@DarrenDavies 很遗憾,您的帖子并没有表明您发布的值仅为示例。而这正是此处重要的信息。 - junix

-1

编写一个小测试程序,亲自试一试:

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位)。符号不影响大小,只影响解释。"

1
返回的是%zu,而不是%dsizeof返回的是size_t,而不是int - Alexey Frunze
1
重要的是注意结果会因为编译平台不同而有所不同。我建议你在回答中加入这个信息,Leor。 - junix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接