4)、注意:没有有关 short 类型的后缀。
6、C++默认的整型常量类型为 int,但如果数字超过了 int 所能表示的范围,则 C++会将整型存储为 long 型,若 long
还无法表示该数,则会存储为 unsigned long
7、对于 8 进制或 16 进制而言,默认也为 int 型,若数值过大,则会被转存为 unsigned int,若 unsigned int 还无法表示
该数,则会转换为 long,若 long 还无法表示该数,则会存储为 unsigned long。因为 8 进制和 16 进制经常用来表示
存储内存的地址,而地址不可能为负,因此这里才会存储为 unsigned 整型。
七、使用指定的格式输出整型值
1、使用控制符可以使整数以指定的格式输出
1)、使用控制符应包含 iostream 头文件,即#include<iostream>,且应使用 std 名称空间,如 using namespace std;
2)、dec 控制符:以十进制显示
3)、oct 控制符:以八进制显示
4)、hex 控制符:以 16 进制显示
5)、showbase 或 noshowbase 控制符:显示或不显示进制的前缀基数,8 进制以 0 开始,16 进制以 0x 开始
6)、uppercase 或 nouppercase 控制符:对 16 进制的字符 A~F 和前缀基数 x,以大写还是小写显示。
7)、以上的控制符对于浮点型是无效的,只能对整型,布尔型,和字符型使用。
2、控制符使用示例:cout<<hex<<showbase<<uppercase<<10<<endl;输出 0XA,表示显示整型常量的前缀基数,以 16
进制显示,并且 16 进制中的字符 A~F 和前缀基数 x 均以大写的形式显示。注意:控制字符 hex,showbase, uppercase
不会被输出。
3、应用控制符之后的内 !"#$%&'()*,+,-./01234'(5678。
9、无符号整型数据的:*;<(以下=7 short int 长度为 16 位)
1、这里的溢出,指的是数值超过整型类型所能表示的最大值或者最小值,比如对于 short int 类型的整型,假设使用 16
位进制存储,则表示的数值范围是-32768~32767,若对 short int 类型赋予一个比这个范围更大或更小的数,则
就产生溢出,比如 short int a=32769; 或 short int b=-32769;等。
2、C++规定,对于无符号整型从不会溢出,若数值大于或小于无符号整型能存储的最大值或最小值的时候,这时应使
用 R mod (M+1)即求模运算来作为最终的结果值,其中 mod 表示的是求模运算(在 C++中使用的是符号%来表示求
模运算符),>?@ABCDEFGH+IJKGLMNOPR 表示实际需要存储的数,M 表示无符号整数能存储
的最大值。比如 unsigned short int a=65537;cout<<a<<endl;则输出 a 的值是 1,因为 65537 mod (65535+1)之后得到的
值为 1,即 65537/65536 的余数为 1,所以最后 a 的值为 1。
3、注意:C++规定的无符号整数 QRS:*,TRUV4W3XYG56AZ@A[\]^_`Jab,比如 unsigned
short int a=65535; unsigned short int b; b=a+2; cout<<b<<endl; 输出 1,可以看到 b 的值并不等于 65537,因为 65537
溢出了,需要对 65537 进行求模运算,最后得到 b 的值是 1。
3、将一个负数赋给一个无符号整型时的情况:这时使用的是与该负数同余的正数来表示其值的,比如对于 unsigned short
int a=-1;cout<<a<<endl;输出 65535,因为-1 与 65535 对模 65536 是同余的,因此 a 的值就是 65535。
4、为什么-1 和 65535 对模 65536 是同余的:在〈计算机原理〉关于补码的内容就有讲解,这里我们以数学的方式来讲
解这个问题,数学中同余的定义是:如果两个正整数 a 和 b 之差能被 n 整除,那么我们就说 a 和 b 对模 n
同余,记作 a≡b (mod n),不难看出-1 与 65535 之差能被 65536 整除,因此他们是同余的。
5、对于无符号整数溢出时的几种简便理解方法:
1)、理解方法一:不难看出,对于无符号整数,当超出他的范围时,数值会被从另一头开始循环,比如对于无符号
短整数而言,正数 65536 因为超出最大数 65535 的范围,因此数值将从另一头(最小值开始)循环,其值为 0,
同理 65537 就表示 1,对于负数也是同样的道理,对于-1,因为超过最小数 0,因此从另一头(最大值开始)循环,
其值就是 65535。
2)、 理解方法二:当数值 R 超出正数的最大范围值 M 时,将数值 R 减去最大值 M+1,最后得到的值就是数值 R 的
值,当数值 R 超出负数的最大范围时,则将 R 加上正数最大范围值 M+1 所得到的值就是 R 的值,比如 unsigned
short int a=-1; 这时 a 的值就是-1+65536=65535。再如 unsigned short int a=65539;其 a 的值是 65539-65535=4;
3)、理解方法三:直接将负数转换为二进制数的补码,再将其转换为对应的无符号 10 进制值,这个值就是无符号
整数溢出时的值;若正数超出长度,则直接将最高位丢弃即可;比如 unsigned short int a=-1; 其中-1 的二进制
形式为 1000 0000 0000 0001(共 16 位),转换为补码就是 1111 1111 1111 1111 因此结果 a 的值就是 65535,同理
unsigned short int a=65536;其二进制就是 1 0000 0000 0000 0000,将最高位丢弃,因此 a 的值就是 0。
c、有符号整型数据的d*;<(以下e7 short int 长度为 16 位)
1、对于有符号整型 C++没有作出规定,也就是说若出现有符号整型产生溢出,则各编译器的处理是不一样的,有些编
译器可能还会出错。
2、VC2005 对于有符号整数数据溢出时的处理方式与无符号整型数溢出的处理是相同的。
1)、比如 short int a=32769;cout<<a<<endl; 输出-32767;下面以 3 种方式来分析这种数的结果,
2)、方法 1:比较容易理解,超出最大值时从另一端开始循环,因为 32769 超出 short int 的最大数 32767,因此从另