1、有符号数和无符号数
1.1 signed和unsigned介绍:
signed和unsigned用于修饰整数类型(包括char)。
(1)、signed 表示有符号,unsigned表示无符号
(2)、有符号数的最大取值要比无符号的小约一半,因为有符号数的最高位被用来做符号位。
(3)、默认的short,int,long,long long为有符号数;
换言之,short等价于signed short,int等价于signed int,long等价于signed long,long long等价于signed long long。
(4)、char本身是signed char还是unsigned char取决于编译器的实现。
(5)、不能用signed和unsigned来修饰float和double,因为它们总是带符号的。
常见的数据类型(只说明numeric类型的)如下:
Type Name | Bytes | Other Names | Range of Values |
char | 1 | ||
unsigned char | 1 | none | 0 to 255 |
short | 2 | short int, signed short int | -32768 to 32767 |
unsigned short | 2 | unsigned short int | 0 to 65535 |
int | * | signed, signed int | System dependent |
unsigned int | * | unsigned | System dependent |
long | 4 | long int, signed long int | -2,147,483,648 to 2,147,483,647 |
unsigned long | 4 | unsigned long int | 0 to 4,294,967,295 |
__int8 | 1 | char, signed char | -128 to 127 |
__int16 | 2 | short, short int, signed short int | -32768 to 32767 |
__int32 | 4 | signed, signed int | -2,147,483,648 to 2,147,483,647 |
__int64 | 8 | none | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
enum | * | none | Same as int |
float | 4 | none | 3.4E +/- 38(7 digits) |
double | 8 | none | 1.7E +/- 308(15 digits) |
long double | 10 | none | 1.2E +/- 4932(19 digits) |
1.2 signed和unsigned类型数据在计算机中的存储:
1.3 表达式中整数类型的转换规则
(1)、所有比signed int类型小的数据(包括signed char,unsigned char signed short,unsigned short)转换为signed int类型。如果转换后的数据会超出signed int类型所能表示的范围的话,则转换为unsigned int类型。
(2)、bool类型转化为int类型时,false转化为0,ture转换为1;反过来所有的整数类型转化为bool时,0转化为false,其它非零值转化为true;
(3)、如果表达式中混有unsigned short和int类型时,如果int类型数据可以表示所有的unsigned short类型的话,则将unsigned short类型转换为int类型,否则,unsigned short类型以int类型都转换为unsigned int类型。
举例:在32位机上,int是32位,范围-2^31 to 2^31 - 1(-2,147,483,648 to -2,147,483,647),unsigned short是16位,范围0 to 65,535。这样int类型足够表示unsigned short类型的数据,因此在混有这两者的运算中,unsigned short类型会被转换为int类型;
(4)、unsigned int 与 long类型的转换规律同3,在32位机上,unsigned int是32位,范围0 to 4,294,967,295,long是32位,范围-2,147,483,648 to 2,147,483,647。可见long类型不够表示所有的unsigned int类型,因此在混有unsigned int以及long的表达式中,两者都被转换为unsigned long。
(5)、如果表达式中既有int又有unsigned int,则所有的int数据都被转化为unsigned int类型。
[例题]:
unsigned int i = 3;
cout << i * -1;
问结果是多少?
经过以上的总结,前面提出的为问题的答案就比较明显了。在表达式i * -1中,i是unsigned int类型,-1是int类型(常量整数的类型同enum),按照第5条可知,-1必须转换为unsigned int类型,即0xffffffff,相当于十进制的4,294,967,295,然后再与3相乘,即4,294,967,295 * 3,如果不考虑溢出的话,结果是12,884,901,885,十六进制为0x2 ffff fffd,由于unsigned int只能表示32位,因此结果是0xffff fffd,即4,294,967,293。