有五种带符号整数类型,其中多数可以由几个近义词指定,如下表Table 2-1
Table 2-1. Standard signed integer types
类型 |
同义词 |
Signed char |
|
Int |
Signed,signed int |
Short |
Short int, signed short,signed short int |
Long |
Long int, signed long, signed long int |
Long long (C99) |
Long long int, signed long long, signed long long int |
对于表Table 2-1中每一个有符号整形类型,存在个相应的占据同样大小内存的无符号类型,换句话说,如果编译器排列signed int对象在偶数字节的地址,那么unsigned int 对象也排列在偶数地址,这些无符号类型可参见下表Table 2-2.
Table 2-2. Unsigned standard integer types
类型 |
同义词 |
_Bool |
Bool(define in stdbool.h) |
Unsigned char |
|
Unsigned int |
Unsigned |
Unsigned short |
Unsigned short int |
Unsigned long |
Unsigned long int |
Unsigned long long |
Unsigned long long int |
C99引入无符号整形_Bool 来表示布尔值,其中true为1,false为0,如果你在程序中包含了头文件stdbool.h,那么你也可以使用标识符bool, true和false.这些对c++程序员来说很熟悉,宏bool 是_Bool类型的同义词,ture和false为常量1和0的象征符号。
Char类型也是整形的一种,但是,一个词的char类型有可能与signed char等价,也有可能与unsigned char相同,这取决于编译器,因为这在执行时才会被选择,char, signed char和unsigned char是形式上不同的三种类型。
注:如果你的程序使用char且取值小于0或大于127,你应该使用signed char或unsigned char来代替。
你可以使用字符变量为编写算法,这取决于你的程序将char变量的值看做字符编码还是其他,例如,下面的代码段中视ch中的char值既为整形,又为一个字符,只是在不同的时刻:
char ch = 'A'; // A variable with type char. printf("The character %c has the character code %d./n", ch, ch); for ( ; ch <= 'Z'; ++ch ) printf("%2c", ch);
在printf()语句中,ch第一次被视为一个字符,且它的值被打印出来,接着打印出它的数值,同样地,在for循环中,指令++ch中,ch被视做整数,在函数printf()中又被看做字符,在系统中使用的是7-bit的ASCII编码,或者它的扩展,这段代码产生如下输出:
The character A has the character code 65. A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Char类型通常占用一个字节,换句话说,sizeof(char)通常等于1,且至少是8位的宽度,基本字符集中的每一个字符均可使用一个char对象来表示其值。
C仅定义其他类型的最小取值,short类型至少两个字节,long至少四个字节,long long至少八个字节,此外,虽然整形可能大于它的最小取值,大小必须遵循下面的顺序:
sizeof(short) ≤sizeof(int) ≤sizeof(long) ≤sizeof(long long)
int 类型是最适合目标系统的整数类型,与CPU寄存器的大小和位格式相适应。
整型的内部表示为二进制,有符号类型可能会使用符号和大小来表示,当做1的补码,或2的补码,最常用的是2的补码,带有符号的非负数的值取值在无符号类型的范围之内,同样,一个非负数的值也使用二进制表示,Table 2-3为对于有符号和无符号整型的位域表示。
Table 2-3. Binary representations of signed and unsigned 16-bit integers
二进制 |
无符号十进制整型 |
有符号十进制整型(1补码) |
有符号十进制整型(2的补码) |
00000000 00000000 |
0 |
0 |
0 |
00000000 00000001 |
1 |
1 |
1 |
00000000 00000010 |
2 |
2 |
2 |
… |
|
|
|
01111111 11111111 |
32,767 |
32,767 |
32,767 |
10000000 00000000 |
32,768 |
-32,767 |
-32,768 |
10000000 00000011 |
32769 |
-32,766 |
-32,767 |
… |
|
|
|
11111111 11111110 |
65,534 |
-1 |
-2 |
11111111 11111111 |
65,535 |
-0 |
-1 |
Table 2-4列出标准整型的大小和取值范围
Table 2-4. Common storage sizes and value ranges of standard integer types |
类型 |
存储大小 |
最小值 |
最大值 |
Char |
(same as either signed char or unsigned char) |
||
Unsigned char |
One byte |
0 |
255 |
Signed char |
One byte |
-128 |
127 |
Int |
Two bytes or four bytes |
-32,768 or -2,147,483,648 |
32,767 or 2,147,483,647 |
Unsigned int |
Two bytes or four bytes |
0 |
65,535 or 2,147,483,647 |
Short |
Two bytes |
-32,768 |
32,768 |
Unsigned short |
Two bytes |
0 |
65535 |
Long |
Four bytes |
-2,147,483,648 |
2,147,483,647 |
Unsigned long |
Four bytes |
0 |
4,294,967,295 |
Long long(C99) |
Eight bytes |
-9,223,372,036, 854,775,808 |
9,223,372,036, 854,775,807 |
Unsigned long long (C99) |
Eight bytes |
0 |
18,446,744,073, 709,551,615 |
下面的例子中,int型变量iIndex和iLimit在32位机器上占据4个字节:
int iIndex, // Define two int variables and
iLimit = 1000; // initialize the second one.
要获得一个类型或变量的占用的空间大小,可以使用sizeof操作符,表达式sizeof(type) 或 sizeof expression会计算出类型或对象的字节数,如果操作数是个表达式,那么计算出的大小将是此表达式类型的大小,在前面的例子中,sizeof(int)和sizeof(iIndex)的大小相同,均为4,iIndex两边的圆括号可以忽略。
你可以在头文件limits.h中找到你的C编译器中整型的范围,它们以宏的形式定义,如INT_MIN, INT_MAX,UINT_MAX等等。下面的例子Example 2-1中使用这些宏来显示char和int的最小值和最大值。
Example 2-1. Value ranges of the types char and int
// limits.c: Display the value ranges of char and int. // --------------------------------------------------- #include <stdio.h> #include <limits.h> // Contains the macros CHAR_MIN, INT_MIN, etc. int main( ) { printf("Storage sizes and value ranges of the types char and int/n/n"); printf("The type char is %s./n/n", CHAR_MIN < 0 ? "signed" :"unsigned"); printf(" Type Size (in bytes) Minimum Maximum/n" "---------------------------------------------------/n"); printf(" char %8d %20d %15d/n", sizeof(char), CHAR_MIN, CHAR_MAX ); printf(" int %8d %20d %15d/n", sizeof(int), INT_MIN, INT_MAX ); return 0; }
在整型的算法中,有可能发现溢出,当一个操作的结果不在类型的取值范围中时就会生溢出,在无符号整型的算法中,溢出被忽略,在数学术语中,一个无符号整型操作的有效结果等于它的值除以UTYPE_MAX+1的余数,这里的UTYPE_MAX为此无符号类型的最大取值,例如,下面的例子将会使变量的值溢出:
unsigned int ui = UINT_MAX;
ui += 2; // Result: 1
C中仅提出了无符号整型的溢出现象,对于其他类型,溢出的结果是没有定义的,例如,溢出可能会被忽略,或者可能抛出一个信号,如果没有被扑获,将使用程序Abort.