今天在写某个程序需要对两个数字字符串进行相加操作,比如字符串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. cdq分治——bzoj2683简单题

    https://www.lydsy.com/JudgeOnline/problem.php?id=2683 知识点:1.以操作的顺序进行分治  2.cdq分治维护矩阵 3.计算比mid小的给比mid大 ...

  2. agumaster 分页方案

    本文例程下载:https://files.cnblogs.com/files/xiandedanteng/agumaster20200430-1.zip 之前的分页方案有点小瑕疵,这回修正了一下. 控 ...

  3. 索引对单列极值查询的显著性影响(百万级别表单列最值查询 Cost由1405变成3)

    表结构: create table hy_emp( id number(7,0) primary key, name nvarchar2(20) not null, salary number(5,0 ...

  4. 索引对单表查询的影响(Cost和consistent gets)

    前提:使用system账户登录sql plus. 建表: SQL> create table t2 as select * from dba_objects; 表已创建. 已用时间: 00: 0 ...

  5. [Java数据结构]LinkedHashMap,TreeMap

    HashMap不能记住插入时的顺序,但LinkedHashMap可以做到这一点. 例程: Map<Integer,String> empMap=new LinkedHashMap<I ...

  6. linux下清空文件内容的3个命令

    1.使用echo "" > file_name,直接将空字符串重定向并覆盖到目标文件 2.使用cat /dev/null > file_name,读取dev目录下的一个 ...

  7. 利用python简单实现unittest

    python3的eval方法 eval() 函数用来执行一个字符串表达式,并返回表达式的值 # 例如 a = [1,2,3,4] b = "a" print(eval(b)) # ...

  8. SpringValid优雅校验入参

    一.简介 后台业务入口类Controller,对于入参的合法性校验,可以简单粗暴的写出一堆的 if 判断,如下: @RestController @RequestMapping("user& ...

  9. 在Notepad++中配置python运行环境

    1.当然首先还是需要先安装Python软件包的,推荐Python 3.X 2.打开Notepad++,[运行]--[运行],或者直接按F5快捷键,输入如下命令: cmd /k cd /d " ...

  10. Spring Boot学习(四)常用注解

    一.注解对照表 注解 使用位置 作用  @Controller  类名上方  声明此类是一个SpringMVC Controller 对象,处理http请求  @RequestMapping  类或方 ...