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