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语言中,char类型和int类型相加时,整体上都遵循整数提升规则,即char类型会先被提升为int类型再进行加法运算,但在结果类型的处理上存在一些细微差异。 ### C语言 在C语言里,当char类型和int类型相加时,char类型会被自动提升为int类型,然后进行加法运算,最终结果是int类型。这是因为在C语言的算术运算中,存在整数提升规则,即较小的整数类型(如char、short)会被提升为int类型再进行计算。 示例代码如下: ```c #include <stdio.h> int main(void) { char a = 127; int b = 4; int c = a + b; a += b; printf("c=%d\n", c); return 0; } ``` 在这个例子中,`char` 类型的变量 `a` 和 `int` 类型的变量 `b` 相加,`a` 会先被提升为 `int` 类型,然后进行加法运算,结果存储在 `int` 类型的变量 `c` 中 [^4][^5]。 ### C++C++中,char类型和int类型相加时,同样会将char类型提升为int类型进行加法运算,但结果类型会根据上下文有所不同。如果最终的结果是int,那么char类型的常量会转换为ASCII值;如果最终的结果是char,那么int类型的常量会跟char类型的ASCII相加,然后根据结果的ASCII值匹配到char。 示例代码如下: ```cpp #include <iostream> using namespace std; int main() { // 0的ASCII值为48,加上3为51,即是3的ASCII值 int a = 3; char b = a + '0'; cout << b << endl; // int b1 = 3 + '0',这种情况下'0'会变成48 int a1 = 3; int b1 = a1 + '0'; cout << b1 << endl; return 0; } ``` 在这个例子中,当结果类型char时,会根据相加后的ASCII值匹配到对应的字符输出;当结果类型为int时,会直接输出相加后的整数值 [^1]。 ### 差异总结 C语言char和int相加结果固定为int类型;而C++中结果类型会根据上下文变化,既可能是int类型,也可能是char类型
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

溪渣渣_梁世华

打赏?我甚至没有任何收费的章节

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值