·数据类型的最高位用于标识数据的符号
-最高位为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课笔记


YingLi
6 声望5 粉丝

From zero to hero.