前言
狄泰软件唐老师的个人学习笔记
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 ) ); //0printf("%d\n", ((b&0x80000000) != 0 ) );//1,//复数最高位是1,与过还是1return 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循环一直执行
如果觉得《2 有符号数与无符号数》对你有帮助,请点赞、收藏,并留下你的观点哦!