今天在写某个程序需要对两个数字字符串进行相加操作,比如字符串1:12345,字符串2:23456。需要1和2相加、2和3相加。就是两个字符相同位置的数进行相加。

这个一看很好完成,写一个for,然后取字符串中每个字符进行相加即可。

比如如下代码:

string a= "12345";
string b= "23456";
string sum = "";
for (int i = 0; i < a.Length; i++)
{
sum += a[i] + b[i];
}

心想结果应该是:357911

实际结果是:99101103105107

初一看是不是有点奇怪,这个结果也不像是字符累加的结果,如字符1+字符2,如果是这样那结果应该也是:1223344556。

难道数据类型问题?转换int再相加试试?

如果下图结果还是一样

其实编译器已经告诉你了这里的类型转换是多余的, 所以(int)颜色变暗了。

当时想这是为什么?随即我把字符串 a和b都换成字符不再使用数字试试。

如下图所示

心想这下输出结果总应该是:abbccddeeffg

实际结果:195197199201203205

看到这个瞬间明白了,char实际存储可能本身就是一个数字,这个数字就是该字符对应的十进制ASCII码。

然后我就找到ASCII码对应表,一看果然是这样

我们回到前面的字符串12345相加的那个问题上,看看。实际上程序相加的是1对应的ASCII+2对应的ASCII,以此类推。

1对应49,2对应50。49+50=99。所以最开始123456字符相加的的结果是99开头的。(99101103105107)

我们看下1-9对应的ASCII

所有char相加一定要单独转换成字符再进行处理。

当我们第一眼感觉sum += a[i] + b[i]或者sum += (int)a[i] + (int)b[i],就能实现数字的相加,可能原因在于我们平时使字符串要取单个字符时比如a[i],他输出显示确实是1,而不是ASCII码对应的49。

我们将代码改下对char字符不参与运算只输出,并看输出结果

我们看结果是12345,直接按照字符输出了。并不是输出ASCII码,我想可能是编译器进行优化导致的,毕竟输出ASCII意义不大。

针对这个问题我还尝试其他语言,Java也是一样的。但是JS不会,JS不会按照ASCII码进行相加。

Java代码

JS代码

												

警惕char类型直接相加的更多相关文章

  1. 1.1两个char类型数据相加后,转化为int类型

    #include<stdio.h> main() { char a = 127; char i=0; char ai=0; ai= a+i; printf("size short ...

  2. (C语言)char类型与int类型相加

    #include <stdio.h> int main(void) { ; ; int c = a + b; a += b; printf("c=%d",c); //p ...

  3. 浅析为什么char类型的范围是 —128~+127

    转载于daiyutage 在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是-128~127,这个问题貌似看起来 ...

  4. JAVA中的char类型

    1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a';  //任意单个字符,加单引号. char a='中';//任意单个中文字,加单引号. char a=1 ...

  5. char类型的数值转换

    在视频教程中,你已经认识到了数字类型之间.字符串和其他类型之间的转换.而某些时候,我们还需要将char类型转换为int类型,或者把int类型转换为char类型. 这篇文章,将介绍在代码中虽然不太常用, ...

  6. 加深关于Java中char类型的理解

    1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a';  //任意单个字符,加单引号. char a='中';//任意单个中文字,加单引号. char a=1 ...

  7. char类型

    1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a';  //任意单个字符,加单引号. char a='中';//任意单个中文字,加单引号. char a=1 ...

  8. 转:浅谈char类型范围

    在 C 语言中, signed char 类型的范围为 -128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是 -128~127,这个问题貌似看起来也很简单容易, 以 ...

  9. [转载]浅析为什么char类型的范围是 —128~+127

    http://blog.csdn.net/daiyutage/article/details/8575248 在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写, ...

随机推荐

  1. 详解 Python 的二元算术运算,为什么说减法只是语法糖?

    原题 | Unravelling binary arithmetic operations in Python 作者 | Brett Cannon 译者 | 豌豆花下猫("Python猫&q ...

  2. Java实现内嵌浏览器

    创建项目 ---->   导入需要的jar ---->  代码实现 需要的jar: https://pan.baidu.com/s/1MEZ1S0LnKSMGQm24QWgmCw 代码: ...

  3. sql如何查询不包含中文

    SELECT * FROM dbo.表名 WHERE 字段名 NOT LIKE '%[吖-座]%'

  4. go http请求流程分析

    前言 golang作为常驻进程, 请求第三方服务或者资源(http, mysql, redis等)完毕后, 需要手动关闭连接, 否则连接会一直存在; 连接池是用来管理连接的, 请求之前从连接池里获取连 ...

  5. 蓝桥杯校内模拟赛Python解答

    @ 目录 1. 15.125GB 2. 约数个数 3. 叶结点数 4. 数字9 5. 数位递增的数 6. 递增三元组 7. 音节判断 8. 长草 9. 序列计数 10. 晚会节目单 1. 15.125 ...

  6. 程序员你是如何降低NPE的?

    程序员,如果系统突然报了一个空指针异常,你肯定像吞了一只苍蝇一样尴尬. 那么如何在日常开发过程中降低NPE? 问题 回答 现状 返回空值会出现大量的空指针异常 目的 改进方法的返回值,降低出现空指针异 ...

  7. 小BUG大原理:FastJSON实体转换首字母小写的尴尬事件

    问题描述 因为项目连接的Oracle数据库,字段名映射方便使用大写,但是通过接口调用返回到前端的字段名首字母为小写,这样带来的问题前端显示的字段就需要写这种很尴尬的格式. 原因分析 开发环境使用的是S ...

  8. Docker添加TLS认证修复2375端口暴露引发的漏洞

    #### 1.环境准备 ```bash# 查看Docker服务器主机名hostnamectl``` ![1582697962553](C:\Users\86176\AppData\Roaming\Ty ...

  9. 痞子衡嵌入式:MCUXpresso IDE下添加C++源文件进SDK工程编译的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下添加C++源文件进SDK工程编译的方法. 最近有客户反映在MCUXpresso IDE下的SDK工程里添加 ...

  10. Java基础之LinkedHashMap原理分析

    知识准备HashMap 我们平时用LinkedHashMap的时候,都会写下面这段 LinkedHashMap<String, Object> map = new LinkedHashMa ...