C语言支持两种不同的数值类型,整数类型,浮点类型。
C语言的整数类型有不同的尺寸。int类型通常为32位,但在老的CPU上可能是16位。有些可能是64位。
因此,int型如果在16位CPU上最大值就是:0111111111111111 对应值是32768(2^15-1)。
在32位CPU上当然就是:01111111111111111111111111111111 对应值是2147 483 647(2^31-1).
同理64位上…………
32位上int型与long类型的最大值相等
但是16位与64位均不同,long比int大2^n次方
C99提供了两个额外的标准整数类型:long long int 和 unsigned long long int 。
这两个long long 类型要求至少64位宽,所以long long int 类型值的范围通常为
-2^63(-9 223 372 036 854 775 808)到2^63-1(-9 223 372 036 854 775 807)
整数溢出怎么办?
整数溢出是的行为要根据操作数是有符号型还是无符号型来确定。有符号整数运算中发生溢出时,程序的行为时未定义的。
无符号整数类型运算过程中发生溢出时,结果是有定义的:正确的答案对2^n取模,其中n是用于存储结果的位数。
例如,如果对无符号的16位数65535加1,其结果可以保证是0.
浮点常量
浮点常量可以有许多种书写方式。例如下面这些常量是表示数57.0的有效方式
57.0 57. 57.0e0 57E0 5.7e1 5.7e+1 .57e2 570.e-1
默认情况下,浮点常量都以双精度数的形式存储。当C语言编译器在程序中发现常量57.0时,他会安排数据以double类型变量的格式存储在内存中。
在某些极个别情况下,可能会需要强制编译器以float或long double 格式存储浮点常量。为了表明只需要单精度,可以在常量的末尾加上字母F或f(如 57.0F);
而为了说明常量必须以long double格式存储,可以在常量的末尾加上字母L或l(如57.0L)。
执行程序时,使用getchar()函数和putchar()函数(胜于scanf和printf)可以节约时间。
注意算术转换中不同类型之间的变化
为了统一操作数的类型,通常可以将相对较狭小类型的操作数转换成另一个操作数的类型来实现
即为所谓的提升,最常用的提升是整值提升,它把字符或段整数转换成int类型(或者在某些情况下是unsigned int类型)
任意操作数是浮点型的情况
long double
^
|
double
^
|
float
如此提升
两个操作数的类型都不是浮点类型的情况。
int ——>unsigned int ——>long int ——>unsigned long int
当把有符号操作数和无符号操作数组合时,把有符号操作数“转换”成无符号的值。转换过程需要加上或者减去n+1的倍数,其中n是无符号类型能表示的最大值
。这条规则可能会导致某些隐蔽的编程错误。
假设int类型的变量 i 的值是-10 而unsigned int 类型的变量u的值是10.如果用“<”运算符比较 i 和 u 那么期望的结果应该是1(真)
但是,在比较前,变量 i 转换成unsigned int类型。因为负数不能被表示成无符号,所以转换后不再是-10,而是加上 4 294 967 296 的结果
即4 294 967 286 因而 i < u 结果是0
因此,最好避免使用无符号整数,特别是不要把它和有符号的整数混合使用
如果数是负数,如何以八进制或十六进制形式书写它???
没有直接的方法可以书写负数的八进制或十六进制。幸运的是需要这样做的情况非常少。当然,
我们可以判定这个数是否是负数,然后自己显示一个负号:
if(i < 0)
printf("-%x",-i);
else
printf("%x",i);