·数据类型的最高位用于标识数据的符号
-最高位为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课笔记
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。