数据类型的最高为用于标识数据
最高位为1,表明这个数是负数
最高位为0,表明这个数是正数
1 #include <stdio.h>
2
3 int main()
4 {
5 char c = -5; // 1个字节
6 short s = 6; // 2个字节
7 int i = -7; // 4个字节
8 /*扫盲:一个字节 = 8位 */
9 printf("%d\n", ( (c & 0x80) != 0 ));
10 printf("%d\n", ( (s & 0x8000) != 0 ));
11 printf("%d\n", ( (i & 0x80000000) != 0 ));
12
13 return 0;
14 }
输出结果:
1
0
1
结果分析:
输出1表示负数,0表示正数
有符号数的表示法(补码)
正数的补码为正数本身
负数的补码为 负数的绝对值 各位取反后加1
1 #include <stdio.h>
2 int main()
3 {
4 unsigned int i = 5;
5 int j = -10;
6 printf("i + j = %d\n",i+j);
7 if( (i + j) > 0 )
8 {
9 printf("i + j > 0\n");
10 }
11 else
12 {
13 printf("i + j <= 0\n");
14 }
15 return 0;
16 }
输出结果:
i + j = -5
i + j > 0
结果分析:
-5是正常想到的值,i+j>0不怎么正常
首先前面使用%d输出,无论是int还是unsigned int结果都将是打印出有符号的数。
i+j运算,则是无符号类型与有符号类型进行运算时,有符号类型会转换成无符号类型进行运算,-10的补码,当成一个无符号类型的源码,将是一个很大的正数。结果是大于0.
无符号数的表示法(原码)
无符号数默认为正数
无符号数没有符号位
对于固定长度的无符号数,最大值+1->最小值,最小值-1->最大值
1 #include <stdio.h>
2 int main()
3 {
4 unsigned int i = 0;
5
6 for(i=9; i>=0; i--)
7 {
8 printf("i = %u\n", i);
9 }
10 return 0;
11 }
运行结果:很大的数,一直循环
Ctrl+C强行停止
结果分析,问题出在unsigned上,无符号类型木有负数,负数的补码当成,正数的源码是一个很大的数。
小结
- 有符号数用补码表示
正数的符号位为0
负数的符号位为1 - 无符号数用原码表示
无符号数木有符号位
无符号数只用于表示正数 - unsigned只能修饰正数类型的变量