2.1.1 算术类型(2)
带符号类型和无符号类型
除去布尔型和扩展的字符型之外,其他整型可以划分为带符号的(signed)和无符号的(unsigned)两种。带符号类型可以表示正数、负数或0,无符号类型则仅能表示大于等于0的值。
类型int、short、long和long long都是带符号的,通过在这些类型名前添加unsigned就可以得到无符号类型,例如unsigned long。类型unsigned int可以缩写为unsigned。
与其他整型不同,字符型被分为了三种:char、signed char和unsigned char。特别需要注意的是:类型char和类型signed char并不一样。尽管字符型有三种,但是字符的表现形式却只有两种:带符号的和无符号的。类型char实际上会表现为上述两种形式中的一种,具体是哪种由编译器决定。
无符号类型中所有比特都用来存储值,例如,8比特的unsigned char可以表示0至255区间内的值。
C++(www.cppentry.com)标准并没有规定带符号类型应如何表示,但是约定了在表示范围内正值和负值的量应该平衡。因此,8比特的signed char理论上应该可以表示-127至127区间内的值,大多数现代计算机将实际的表示范围定为-128至127。
建议:如何选择类型
和C语言一样,C++(www.cppentry.com)的设计准则之一也是尽可能地接近硬件。C++(www.cppentry.com)的算术类型必须满足各种硬件特质,所以它们常常显得繁杂而令人不知所措。事实上,大多数程序员能够(也应该)对数据类型的使用做出限定从而简化选择的过程。以下是选择类型的一些经验准则:
当明确知晓数值不可能为负时,选用无符号类型。
使用int执行整数运算。在实际应用中,short常常显得太小而long一般和int
有一样的尺寸。如果你的数值超过了int的表示范围,选用long long。
在算术表达式中不要使用char或bool,只有在存放字符或布尔值时才使用它
们。因为类型char在一些机器上是有符号的,而在另一些机器上又是无符号的,
所以如果使用char进行运算特别容易出问题。如果你需要使用一个不大的整数,
那么明确指定它的类型是signed char或者unsigned char。
执行浮点数运算选用double,这是因为float通常精度不够而且双精度浮点
数和单精度浮点数的计算代价相差无几。事实上,对于某些机器来说,双精度运
算甚至比单精度还快。long double提供的精度在一般情况下是没有必要的,
况且它带来的运行时消耗也不容忽视。
2.1.1节练习
练习2.1:类型int、long、long long和short的区别是什么?无符号类型和带符号类型的区别是什么?float和double的区别是什么?
练习2.2:计算按揭贷款时,对于利率、本金和付款分别应选择何种数据类型?说明你的理由。