今天学习C语言中的有符号与无符号
文章目录
1 计算机中的符号位
C语言中,数据类型的最高位,用于标识数据的符号。
- 最高位为1,表明这个数为负数
- 最高位为0,表明这个数为正数
比如下图:
1.1 有符号数的表示法
- 在计算机内部用补码表示负数
- 正数的补码为正数本身
- 负数的补码为负数的绝对值各位取反后加1
比如下图中的:
1.2 无符号数的表示法
- 在计算机内部,用源码表示无符号数。
- 无符号数默认为正数
- 无符号数没有符号位
- 对于固定长度的无符号数有:
- MAX_VALUE +1 --> MIN_VALUE
- MIN_VALUE - 1 --> MAX_VALUE
1.3 signed 和 unsigned
- 在C语言中,变量默认为有符号的类型
- unsigned 关键字声明变量为无符号类型
但是要注意一点,只有整数类型(int,char,long,short)能够声明unsigned变量
2 实验-当有符号数与无符号数进行运算
如下程序的运行代码:
#include <stdio.h>
int main()
{
unsigned int i = 5;
int j = -10;
if( (i + j) > 0 )
{
printf("i + j > 0\n");
}
else
{
printf("i + j <= 0\n");
}
return 0;
}
运行结果将是i+j >0 。
- 因为有符号数与无符号数进行混合运算时,会将有符号数转换成无符号数后再进行计算,计算结果就变成了无符号数了。所以上述结果为正数
3 错误的使用了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循环会一直循环下去。
4 总结
- 有符号数用补码表示
- 正数的符号位为0
- 负数的符号位为1
- 无符号数用源码表示
- 无符号数没有符号位
- 无符号数只能用于表示正数以及0
- unsigned 只能用于修饰正数类型的变量
- 有符号数与无符号数进行混合运算时,会将有符号数转换成无符号数后再进行计算,计算结果就变成了无符号数了