我刚开始编写C编程。语言,并希望直接获得数据类型 - 大小 - 值主题。
我见过几个不同数据类型的值范围表(such as this one)。
问题是,我在这里学到并读到有不同的参数影响每种数据类型的大小,我的假设是值范围也应该有所不同。
例如,如果1 byte = 16 bit
,那么我认为signed char
可以容纳0-65535。
这些表的准确度如何?它们显示的范围是否有保证(但类型实际上也可以保持更小\更大的值)?
答案 0 :(得分:4)
C语言规范没有为每种数据类型定义任何确切的范围。它仅定义特定类型应该能够容纳的最小值。
在那个表上提出你的问题,它不是由C定义的范围的准确表示。在作者运行它的特定平台上可能是这样。但它并不总是(也不应该)被视为权威来源。
如果您想了解平台的确切范围,请查看(或包含)<limits.h>。或者您可以在类型上使用sizeof
运算符来从编译器获取信息。
如果您想知道位的确切数量,请使用CHAR_BIT
中定义的<limits.h>
。
例如,可以使用CHAR_BIT * sizeof(int)
找到int中的位数。
对于给定类型T
,同样可以找到位数:CHAR_BIT * sizeof(T)
。
另请阅读与您的问题非常相关的第一个3 or 4 questions from the C-FAQ。
答案 1 :(得分:0)
必须提供此处显示的最小范围。它是标准保证的最低要求,所有符合要求的实现至少会提供。
答案 2 :(得分:0)
C是一种“接近金属”的语言,因此有些东西(比如 int 的大小)取决于你编译的特定架构。在您的程序离开之前总是知道它,因此您可以使用 sizeof 和 #defines
轻松处理它在任何地方找到的表仅供参考。您只能依赖于编译器可见的内容。
答案 3 :(得分:0)
您的思维过程或多或少是正确的。这些表通常是可靠的,因为只要知道它们的大小,它们就很容易计算。
字符总是大一个字节(8位,而不是16位),并且一个字节将只有2 ^ 8 = 256种可能的组合,因此字符的范围将只为0到255或-128到127,具体取决于是否签名。
对于我们的其他整数,同样的逻辑适用。这里唯一的区别是这些类型的大小取决于您编译的操作系统(表确认,为2个字节的int和4个字节的int赋予不同的范围)。
除了大小(以字节为单位)之外,没有其他参数可以影响这些类型可以容纳的值,如果你做的是依赖于它们的大小(比如整数溢出),你应该使用sizeof()来检查为此。