序言
最近在一个群里看到有人问起怎么把1字节-8bit的char类型数据存进4字节-32bit的double类型里面,很简单就解答了他的问题,自己也试试看把char类型数据存进double类型里,结果理算当然以为的计算结果大大打脸,把以前老师教的都忘得差不多了,所以特地写下这篇以作基础计算记录。
注:我写的只是起因,但我实际写的是char的运算
一、char类型相+
两个char的类型运算实际上是其ASCII码运算,因为char在存储器的是用ASCII码存储的,int的才是补码,比如说:
char test = 192;
char test2 = 202;
test += test2;
cout << test << endl;
按照理论上来说,其应该等于394对吧,但并不是,char类型8字节是按1位 符号位+ 7位 数据位
划分计算的。
诶,想必会有一知半解的人出来这么计算。
192 = 0xC0 = 1100 0000
202 = 0xCA = 1100 1010
1 1000 1010
结果为138 或者 -138 或者 -10 或者 394
计算过程没错,但结果算错了,计算出1 1000 1010
后,还有两个步骤:
1、字节长度限定
char类型是8bit/8位存储,所以计算结果超过8位的都会去掉,实际是
1000 1010
2、符号位的不同“看”法
当符号位为0时,该怎么看二进制就怎么看二进制
0000 1010 = 10
说起当符号位为1时,首先要知道一个范围,-128~127,这是怎么来的呢?
7位的最大数值111 1111
是127,char类型最高也只能表示到这了,unsigned char的才是没有符号位,8位全计算。
符号位为0时,7位的数据位是从0到127;
符号位为1时,还有7位数据位表示负值的方向,0到127共128个二进制表示方法已经被0符号位占取了,所以是从-1往后延伸,最高表示可以达到-128。
计算机没有减法,因为要加快效率,就是让算法更加的简单,如果都弄上加减乘除,计算机的基础电路设计就会变得十分复杂,所以即便是1-1,计算机看来也只是1+(-1)。
知道这个就好办了,按顺序来说,
0000 0000 -》 0111 1111 0 -》 127
1000 0000 -》 1111 1111 -128 -》 -1
看到这里了,很容易推导出
0111 1111 + 1 -》 1000 0000 127 + 1 -》 -128
1111 1111 + 1 -》 0000 0000 -1 + 1 -》 0
再看回这道代码,其计算出来的结果为 -118
char test = 192;
char test2 = 202;
test += test2;
cout << test << endl;
简而言之,就是1符号位的,-128加上7位数据位表示的数据就是答案。
比如说
1000 1010 这么看: -128 + 10 (1010) 即-118
1000 0000 + 0000 1010 = 1000 1010
后续待续