前言
狄泰软件唐老师的个人学习笔记
1、有符号数
有符号数中数据类型的最高位是数据的符号位
- 最高位为1,表明这个数为负数
- 最高位为0,表明这个数为正数
实验:检验数据的最高位是否是 符号位
#include <stdio.h>
int main()
{
char i = 5;
short a = 2;
int b = -2 ;
printf("%d\n", ((i&0x80) != 0 ) ); //0,
printf("%d\n", ((a&0x8000) != 0 ) ); //0
printf("%d\n", ((b&0x80000000) != 0 ) );//1,
//复数最高位是1,与过还是1
return 0;
}
计算机内部,最高位为符号位,其他位用补码表示有符号数
- 正数的补码是 正数本身
- 负数的补码为 负数的绝对值各位取反+1
8位整数 5 的补码为: 0000 0101
8位整数 -7 的补码为:1111 1001 (7为 0000 0111 ,各位取反 1111 1000,再+1 )
16位整数 20 的补码为: 0000 0000 0001 0100
16位整数 -13 的补码为:1111 1111 1111 0011
2、无符号数
- 计算机中用 原码表示无符号数
- 无符号数默认正数 (最小值为0,最大值看占用内存)
- 对于无符号数,最大值+1 = 最小值(0);最小值 (0)-1 = 最大值
- 由于无符号数没有符号位,所以无符号数的范围比有符号数大一倍
signed与unsigned
C语言中变量默认为有符号的类型
unsigned关键字声明变量为无符号类型,比如 unsigned char
其中,float没有无符号,不能用unsigned
实验:有符号数与无符号数运算
#include <stdio.h>
int main()
{
unsigned int i = 5;
int j = -10;
if( (i+j) > 0 )
{
printf("i+j > 0");//这里输出,原因如下
}
else
{
printf("i+j < 0");
}
return 0;
}
当有符号数与无符号数一起运算时,有符号数会被看作无符号数,
-10 为的二进制 1111 1111 1111 1111 1111 1111 1111 0110,把这个看作无符号,这是很大的正数,所以i+j > 0
实验:
#include <stdio.h>
int main()
{
unsigned int i = 0;
for( i=9; i>=0; i--)
{
printf("i=%u", i); //%u是无符号十进制整数
}
return 0;
}
因为是无符号整数,i 为0后再减是最大值,不会是期望中的负数,所以for循环一直执行