C数据类型的值范围是“系统”依赖的?

我刚开始编写C编程。 语言,并希望直接获得数据类型 – 大小 – 值主题。

我见过几个不同数据类型的值范围表( 比如这个 )。

问题是,我在这里学到并读到有不同的参数会影响每种数据类型的大小,我的假设是值范围也应该有所不同。

例如,如果1 byte = 16 bit那么我认为signed char可以保存0-65535。

这些表的准确度如何? 它们显示的范围是否有保证(但类型实际上也可以保持更小\更大的值)?

C语言规范没有为每种数据类型定义任何确切的范围。 它只定义了特定类型应该能够容纳的最小值

表上提出您的问题,它不是由C定义的范围的准确表示。在作者运行它的特定平台上可能是这样。 但它并不总是(也不应该)被视为权威来源。

如果您想知道平台上的确切范围,请查看(或包含) < limits.h > 。 或者您可以在类型上使用sizeof运算符来从编译器获取信息。

如果您想知道确切的位数,请使用定义的CHAR_BIT

例如,可以使用以下命令找到int中的位数: CHAR_BIT * sizeof(int)

对于给定类型T ,以相同的方式,可以找到位数: CHAR_BIT * sizeof(T)

另请阅读C-FAQ中与您的问题非常相关的前3或4个问题。

必须提供此处显示的最小范围。 它是标准保证的最低要求,所有符合要求的实施方案至少会提供。

C是一种“接近金属”的语言,因此有些东西(比如int的大小)取决于你正在编译的特定架构。 在您的程序离开之前总是知道它,因此您可以使用sizeof#defines轻松处理它

在任何地方找到的表仅供参考。 您只能依赖于编译器可见的内容。

你的思维过程或多或少是正确的。 这些表通常是可靠的,因为只要知道它们的大小,它们就很容易计算。

字符总是大一个字节(8位,而不是16位),并且一个字节将只有2 ^ 8 = 256种可能的组合,因此字符的范围将只有0到255或-128到127,取决于它是否签名。

对于我们的其他整数,同样的逻辑适用。 这里唯一的区别是这些类型的大小取决于您编译的操作系统(表确认,为2个字节的int和4个字节的int给出不同的范围)。

除了它们的大小(以字节为单位)之外,没有其他参数可以影响这些类型可以容纳的值,如果你正在做一些依赖于它们的大小的事情(比如整数溢出),你应该使用sizeof()来检查它。