数据类型选择
偶然发现关于数据类型选择之前没注意到的点,做此记录。
- 整型
- 浮点型
- 字符型(字符型实际上属于整型的一种,但这里分开讨论)
整型
取值范围
整型类型的取值范围会根据机器的不同而不同,但规定了如下最小值:
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
的类型。
为了保持最佳的可移植性,把字符的值限制在有符号和无符号范围的交集之间
显示地将这类变量声明为
signed
或unsigned
,可以提高可移植性,确保在不同的机器中在字符是否有符号方面保持一致。只有当
char
类型显示声明了符号类型时才对其进行算术运算。许多处理字符的库函数将参数声明为
char
,而若将参数显示声明为signed
或unsigned
时可能会带来兼容性问题。
参考资料
- 《C++ Primer 中文版 (第5版)》
- 《C 和指针》
- 《C语言程序设计现代方法 第2版》
- c++ - Sholud I usedoble or float? - Stack Overflow