了解更多知识请点我:学习C语言之路(汇总篇)
signed 无符号负数原理解答
问题:为什么signed char的范围是-128~127
函数案例
#include<stdio.h>
int main(int argc, char *argv[])
{
signed char Num1 = 0xB7; //0x10110111
unsigned char Num2 = 0xB7 ; //0x10110111
printf("Num1=%d,Num2 = %d\n", Num1,Num2);
return 0;
}
仿真测试&结果
#include<stdio.h>
int main(int argc, char *argv[])
{
signed char Num1 = 0xB7; //0x10110111
unsigned char Num2 = 0xB7 ; //0x10110111
printf("Num1=%d,Num2 = %d\n", Num1,Num2);
return 0;
}
问题来了
结果signed char Num1 = -73 //0x10110111
结果unsigned char Num2 = 183. //0x10110111
原理:负数在计算机里面有补码的概念
结果讲解
Num1 = 1*(-2^7)+ 1*(25)+1*(24)+22+21+2^0;
-128+32+16+4+2+1 = 73
Num2 = 1*(2^7)+ 1*(25)+1*(24)+22+21+2^0;
128+32+16+4+2+1 = 183
负数补码原理
负数的补码就是将原码的值所有值去反再+1
举例
-1 = 转 0000 0001 》 1111 1110 然后在后面加+1 》 1111 1111 》-128+127 = -1
-3 = 转 0000 0011 》 1111 1100 然后再后面加+1 》1111 1101 》-128 +125 = -3
正数补码为它本身