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 |