首先,我们看看在Java语言中,一个较为经典的问题。
short s = 1;s= s+1;
读者认为上述程序执行后,s的值是多少?如果稍不注意,我们很容易的得到答案是s的值为2.但是,实际上上述程序根本就不会编译通过。为什么呢?
原因是:1)java程序中,关于算术类型进行四则运算时,所有小于int类型的数进行运算时,其结果将转换为int类型,这是因为在计算时是按照机器字长进行的;2)Java类型转换非常严格,自动转型只能是从小类型到大类型进行,若反过来必须进行强制转型,即在前面加上强制转型运算符,例如,s=(short) (s+1);但如果上述程序是这样的,short s=1;s+=1;则程序运行后s的值就是2,至于为什么会这样,我也希望有哪位读者可以告诉我,在此先谢。
如果你使用过java,你可能知道在Java中的整数默认为int类型,而浮点数默认是double,例如如果你定义float f = 1.0;是无法编译通过的。我们这里不是讨论Java的这些问题,但有一个问题值得我们去深思,即,为什么Java有默认的类型,默认的类型为什么是这些?这就是我们为什么要说的类型选择技巧了。
那么,在定义算术类型变量时,到底使用什么类型比较适合呢?
针对整型,到底使用int?还是short?还是long?当然,在面对具体需要的时候,应该使用具体的类型。我们知道,在计算机中,在某一时刻参加运算的数据是以一个机器字长参与运算的。因此,对于整数而言,将整数设置为int是合理的,int的长度刚好是一个机器字长(比如32位机器)。short类型的数据表示范围是半个机器字长,如果使用short类型,一不小心可能给short类型变量赋一个超过其范围的值,这就容易出现“截断”现象,使得程序执行得到不可预期的结果。对于一个完全可以使用int范围表示的数据,在那些使用32位表示int用64位表示long的机器上,如果用long类型的执行花费的代价要远远高于int类型。而一般情况下,使用int类型足矣满足日常的运算需要。因此,建议定义整数类型时使用int。
针对浮点类型,使用float、double、还是long double?
float类型虽然是一个机器字长的表示范围,但是它只能保证6位有效数字,因此,在运算中float类型的隐式精度损失往往是不可忽视的,因此,建议使用double类型,而long double则花费的代价太高,没有必要用那么大的精度来保存通常的数值。
由此可知为什么Java设计者很聪明的将int、double类型设置为数字常量的默认类别了。
对于整型的signed和unsigned到底使用哪种好呢?当然,如果数值有可能是负数,那么当然要使用signed。但是,有些问题不会涉及到负数的,比如计算大小、元素个数之类的,建议使用unsigned的,这不会有错的。
至于通常编程时定义的char类型,到底是signed char还是unsigned char呢,例如 char c,那么c是signed还是unsigned?当程序中定义普通char类型时,不同的编译系统不同,可能编译为signed char,也可能unsigned char。
总而言之,在进行编程时,除了程序特别需要,不然,通常情况下使用int来保存整数,使用double来保存浮点数。