文章目录
- 1 计算机中的符号位
- 2. 有符号数的表示法
- 3.无符号数的表示法
- 4. signed 和 unsigned
- 5. 当有符号数与无符号数进行运算
- 6. 错误的使用了unsigned
- 6. 总结
1 计算机中的符号位
C语言中,数据类型的最高位,用于标识数据的符号。
- 最高位为1,表明这个数为负数
- 最高位为0,表明这个数为正数
#include <stdio.h>int main()
{char c = -5;short s = 6;int i = -7;printf("%d\n", ( (c & 0x80) != 0 )); //打印 1printf("%d\n", ( (s & 0x8000) != 0 )); //打印 0printf("%d\n", ( (i & 0x80000000) != 0 )); //打印 1return 0;
}
2. 有符号数的表示法
- 在计算机内部用补码表示负数:正数的补码为正数本身,负数的补码为负数的绝对值各位取反后加1
3.无符号数的表示法
-
在计算机内部,用源码表示无符号数:无符号数默认为正数,无符号数没有符号位
-
对于固定长度的无符号数有:MAX_VALUE +1 --> MIN_VALUE,MIN_VALUE - 1 --> MAX_VALUE
4. signed 和 unsigned
- 在C语言中,变量默认为有符号的类型
- unsigned 关键字声明变量为无符号类型
5. 当有符号数与无符号数进行运算
当同类型有符号与无符号整数进行运算时,有符号整数会被转换为无符号整数 (如果整数类型不一致还需要考虑类型转换问题,目前只考虑整数类型一致)
#include <stdio.h>int main()
{unsigned int i = 5;int j = -10;if( (i + j) > 0 ){printf("i + j > 0\n"); //结果大于0,此行打印语句被执行}else{printf("i + j <= 0\n");}return 0;
}
6. 错误的使用了unsigned
#include <stdio.h>int main()
{unsigned int i = 0;for(i=9; i>=0; i--){printf("i = %u\n", i);}return 0;
}
因为变量i是无符号数,所以i肯定大于等于0,上述的for循环会一直循环下去
6. 总结
-
有符号数用补码表示:正数的符号位为0,负数的符号位为1
-
无符号数用源码表示:无符号数没有符号位,无符号数只能用于表示正数以及0
-
unsigned 只能用于修饰正数类型的变量
-
有符号数与无符号数进行混合运算时,会将有符号数转换成无符号数后再进行计算,计算结果就变成了无符号数了
无符号数没有符号位,无符号数只能用于表示正数以及0 -
unsigned 只能用于修饰正数类型的变量
-
有符号数与无符号数进行混合运算时,会将有符号数转换成无符号数后再进行计算,计算结果就变成了无符号数了