1.算数类型
.a.算数类型分为两类:整型(包括字符和布尔类型在内)和浮点型;
b.除去布尔类型和扩展的字符型外,其他整型划分为带符号的(signed)和无符号的(unsigned)两种;
c.与其他整型不同,字符型被分为三种:char,signed char和unsigned char,但是类型char实际上会由编译器决定表现为上述两种形式中的一种,因此字符表现形式只有两种;
2.当我们使用了一种类型而其实对象应该取另一种类型时,程序会自动进行类型转换。
a.当我们附给无符号类型一个超出它的表示范围它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。
例如:unsigned char c=-1;
8比特大小的unsigned char可以表示0至255区间共256个值。
-1的补码是0xFFFFFFFF,化成10进制是4294967295,对256取模得255
b.当我们给带符号类型一个超出它表示的范围时,结果是未定义的。程序状况未知。
c.如果表达式里既有带符号类型,又有无符号类型,当带符号类型取值为负时会出现异常结果,这是因为带符号数会自动转换成无符号数。
例如:(unsigned)1*(signed)-1=4294967295;
d.当用无符号数来写循环时应该注意。
如:for(unsigned i=10;i>=0;--i)
std::cout<<i<<std::endl;
当i=0后减1得-1,-1会自动穿换成一个合法的无符号数,会变成死循环。
一种解决办法是用while语句来代替for语句,因为我们能在输出之前先减1
即unsigned i=11;
while(i>0){
--i;
std::cout<<i<<std::endl;
}
由于要先做减1得操作,所以初始化u得值应该比输出最大值大1