1. C语言支持所有整型数据类型的有符号和无符号运算,尽管C语言标准并没有指定用哪种方式来表示有符号整数,但是几乎所有的 机器都使用补码。
2. C语言中默认的整形数据是有符号的,并且允许无符号数和有符号数之间进行转换。转换的原则是底层的位保持不变。
3. 执行运算时,如果一个运算数是有符号的而另一个是无符号的,那么C语言会隐式的将有符号参数强制类型转换为无符号数,并假 设这两个数都是非负的。
4. 无符号数的编码
假设一个整数数据类型有w位。我们可以用x来表示整个向量。我们用一个函数
考虑32位所能表示的值得范围。
最小值为用位向量[00000000000000000000000000000000]表示,也就是整数值0;
最大值为用位向量[11111111111111111111111111111111]表示,也就是整数值 (2^32)-1=4294967295。
5. 有符号数编码
最常见的有符号数的计算机表示方式就是补码形式。
在补码的定义中,将字的最高有效位解释为负权。用函数
同样考虑32位补码所能表示的值得范围。
能表示的最小值的位向量[10000000000000000000000000000000],其整数值为 -2^31= -2147483648
能表示的最大值的位向量[01111111111111111111111111111111],其整数值为 (2^31)-1= 2147483647
6. 有符号数的其他表示方法
反码:
原码,最高有效位是符号位,用来确定剩下的位应该取负权还是正权。
术语补码源于这样一种情况,对于非负数x,我们用(2^w)-x(这里只有一个2)来计算 -x 的w位表示。
术语反码来源于这样一个属性,我们用[1111…1]-x来计算 -x 的反码表示。
重要的数字
数 |
字长 |
|||
8 |
16 |
32 |
64 |
|
UMax |
255 0x FF |
65535 0x FFFF |
4294967295 0x FFFFFFFF |
18446744073709551615 0x FFFFFFFFFFFFFFFF |
TMin |
-128 0x 80 |
-32768 0x 8000 |
-2147483648 0x 80000000 |
-9223372036854775808 0x 8000000000000000 |
TMax |
127 0x 7F |
32767 0x 7FFF |
2147483647 0x 7FFFFFFF |
9223372036854775807 0x 7FFFFFFFFFFFFFFF |
-1 |
0x FF |
0x FFFF |
0x FFFFFFFF |
0x FFFFFFFFFFFFFFFF |
0 |
0x 00 |
0x 0000 |
0x 00000000 |
0x 0000000000000000 |
C语言中数字数据类型的字节数
C声明 |
32位机器 |
64位机器 |
char |
1 |
1 |
short int |
2 |
2 |
int |
4 |
4 |
long int |
4 |
8 |
long long int |
8 |
8 |
char * |
4 |
8 |
float |
4 |
4 |
double |
8 |
8 |
32位机器上C语言的整形数据类型的典型取值范围(方括号中的文字是可选的)
C数据类型 |
最小值 |
最大值 |
char |
-128 |
127 |
unsigned char |
0 |
255 |
short [int] |
-32768 |
32767 |
unsigned short [int] |
0 |
65535 |
int |
-2147483648 |
2147483647 |
unsigned [int] |
0 |
4294967295 |
long [int] |
-2147483648 |
2147483647 |
unsigned long [int] |
0 |
4294967295 |
long long [int] |
-9223372036854775808 |
9223372036854775807 |
unsigned long long [int] |
0 |
18446744073709551615 |
64位机器上C语言的整形数据类型的典型取值范围(方括号中的文字是可选的)
C数据类型 |
最小值 |
最大值 |
char |
-128 |
127 |
unsigned char |
0 |
255 |
short [int] |
-32768 |
32767 |
unsigned short [int] |
0 |
65535 |
int |
-2147483648 |
2147483647 |
unsigned [int] |
0 |
4294967295 |
long [int] |
-9223372036854775808 |
9223372036854775807 |
unsigned long [int] |
0 |
18446744073709551615 |
long long [int] |
-9223372036854775808 |
9223372036854775807 |
unsigned long long [int] |
0 |
18446744073709551615 |