数据类型选择

偶然发现关于数据类型选择之前没注意到的点,做此记录。

  • 整型
  • 浮点型
  • 字符型(字符型实际上属于整型的一种,但这里分开讨论)

整型

取值范围

整型类型的取值范围会根据机器的不同而不同,但规定了如下最小值:

  • short int 至少 16 位
  • int 至少 16 位
  • long int 至少 32 位
  • long long int 至少 64 位

听上去长整型应该比短整型所能表示的值要大,但是这个假设并不一定正确。整型值之间相互的大小规则如下:

  • int类型不能比short int类型短
  • long int类型不能比int类型短

而标准并没有规定3个数值必须不同,因此基于上述规则,如果某机器的环境字长是32位,且没有指令能更有效处理更短的整型值时,可能上述提到的3个整型值都为32位。

当数值超过int表示的范围时,选用long long int

对于特定的实现,确定整数类型范围的一种方法是检查<limits.h>

浮点型

  • 浮点数字面值在缺省情况下是double类型。
  • 执行浮点数运算时选用double类型,精度高于float类型,而实际上单精度和双精度的计算代价相差无几,甚至有些机器运算双精度浮点数更快。
  • long double提供扩展精度,但一般情况下没有必要,且会带来运行消耗。

字符型

字符在本质上是小整型值。标准中没有规定char类型缺省是无符号型还是有符号型,取决于编译器,有些编译器将其作为有符号数来处理,有些编译器作为无符号数来处理,而另有一些编译器提供编译选项来选择char的类型。

  • 为了保持最佳的可移植性,把字符的值限制在有符号和无符号范围的交集之间

  • 显示地将这类变量声明为signedunsigned,可以提高可移植性,确保在不同的机器中在字符是否有符号方面保持一致。

  • 只有当char类型显示声明了符号类型时才对其进行算术运算。

  • 许多处理字符的库函数将参数声明为char,而若将参数显示声明为signedunsigned时可能会带来兼容性问题。

参考资料