C/C++ char类型相加的计算——加法运算

序言

最近在一个群里看到有人问起怎么把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 + 101010) 即-118
              1000 0000 + 0000 1010  = 1000 1010

后续待续

你可能感兴趣的:(C/C++,c语言,c++,开发语言)