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

问题描述 投票:0回答:6

我对这个问题找到了不同的答案,但我知道一定有一个明确的答案。 C 中四种主要数据类型的最小分配内存大小是多少?

int
double
float
char
是我想到的。
signed
unsigned
类型是否会以任何方式改变尺寸?

c variables
6个回答
9
投票

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

  • 字符
    • 最小有符号范围:-127 .. 127
    • 最小无符号范围:0 .. 255
    • 可以更大,但无论大小如何,sizeof(char) == 1
    • sizeof(无符号字符)== 1
    • 最小有符号范围:-32767 .. 32767
    • 最小无符号范围:0 .. 65535
    • 可以更大
    • 最小有符号范围:-2147483647 .. 2147483647
    • 最小无符号范围:0 .. 4294967295
    • 可以更大
  • int
    • 必须至少具有与短线相同的范围
    • 可以具有与 long 相同的范围
    • 范围不能大于 long
    • 短<= int, and int <= long

从 C23 (C++20) 开始,需要补码,将下限扩大 1(因此现在需要

sigend char
能够保持 -128 而不是 -127

浮点数和双精度数还有很多规则,但一般来说,浮点数的范围是 <= the range of a double (for modern machines---float is 4 bytes, double is 8).


2
投票

标准仅保证

char
1
字节。
其余类型具有实现定义的大小。


2
投票

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

不。它仅影响所保存数据的范围。请参阅下面的示例了解短数据类型(2 个字节)。

  • 签署 -32,768 至 +32,767
  • 无符号 0 到 65,535

1
投票

这是一个很好的问题。我建议您参考C99 6.2.5。 Wikipedia C data types 文章很好。

  • 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 并不需要它。 但如果你的char大小是32位,那么sizeof(float)可能只有1。

  • 有符号/无符号不改变大小。

由于这些原因,

<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 架构决定。


-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)。 标志不影响大小,只影响解释。

© www.soinside.com 2019 - 2024. All rights reserved.