·数据类型的最高位用于标识数据的符号
- 最高位为 1,表明这个数为负数
- 做高位为 0;表明这个数为正数
·一个字节是 8 位,两个字节是 16 位
char -128 ~ +127 (1 Byte)
short -32768 ~ + 32767 (2 Bytes)
unsigned short 0 ~ 65536 (2 Bytes)
int -2147483648 ~ +2147483647 (4 Bytes)
unsigned int 0 ~ 4294967295 (4 Bytes)
例程 1:
include”stdio.h”
int main()
{
char i = -5;
short j = 9;
int k = -4;
printf("%d\n",(i & 0x80) != 0);
printf("%d\n", (j & 0x8000) != 0);
printf("%d\n", (k & 0x80000000) != 0);
}
输出结果:
1
0
1
·在计算机内部用补码表示有符号数
- 正数的补码为正数本身
- 负数的补码为负数的绝对值各位取反后加 1
8 位整数 5 的补码为:0000 0101
8 位整数 - 7 的补码为:1111 1001
16 位整数 20 的补码为:0000 0000 0001 0100
16 位整数 -13 的补码为:1111 1111 1111 0011
·在计算机内部用原码表示无符号数
- 无符号数默认为正数
- 无符号数没有符号位
signed 和 unsigned
·C 语言中变量默认为有符号的类型
·unsigned 关键字声明变量为无符号类型
☆ C 语言中只有整数类型能够声明 unsigned 变量,浮点数不能用 unsigned
例程 2:
include”stdio.h”
int main()
{
unsigned int i = 5;
signed int j = -10;
if (i + j > 0)
{printf("i + j > 0 \n");
}
else
{printf("i + j < 0 \n");
}
}
输出结果:
i + j > 0
结论:当有符号数和无符号数进行数学运算的时候,有符号数会变成无符号数,因为负数在内存里面最高位等于 1,当负数看做无符号数的时候,会变成很大的正数,所以大于零
例程 3:#include “stdio.h”
int main()
{
unsigned int i = 0;
for (i = 9; i >= 0; i--)
{printf("i = %u\n",i);
}
return 0;
}
输出结果:
错误
结论:无符号数最小值为 0;i–,会变成负数,又因为无符号是不可能得到负数的,所以会产生死循环
小结:
·有符号数用补码表示
- 正数的符号位为 0;
- 负数的符号位为 1;
·无符号数用原码表示
- 无符号数没有符号位
- 无符号数只用于表示正数
·unsigned 只能修饰整数类型的变量
当无符号数与有符号数混合计算时,会将有符号数转换为无符号数后再进行计算,结果为无符号数。
狄泰软件学院课程 - 第 2 课笔记