警惕char类型直接相加
今天在写某个程序需要对两个数字字符串进行相加操作,比如字符串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两个char类型数据相加后,转化为int类型
#include<stdio.h> main() { char a = 127; char i=0; char ai=0; ai= a+i; printf("size short ...
- (C语言)char类型与int类型相加
#include <stdio.h> int main(void) { ; ; int c = a + b; a += b; printf("c=%d",c); //p ...
- 浅析为什么char类型的范围是 —128~+127
转载于daiyutage 在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是-128~127,这个问题貌似看起来 ...
- JAVA中的char类型
1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a'; //任意单个字符,加单引号. char a='中';//任意单个中文字,加单引号. char a=1 ...
- char类型的数值转换
在视频教程中,你已经认识到了数字类型之间.字符串和其他类型之间的转换.而某些时候,我们还需要将char类型转换为int类型,或者把int类型转换为char类型. 这篇文章,将介绍在代码中虽然不太常用, ...
- 加深关于Java中char类型的理解
1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a'; //任意单个字符,加单引号. char a='中';//任意单个中文字,加单引号. char a=1 ...
- char类型
1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a'; //任意单个字符,加单引号. char a='中';//任意单个中文字,加单引号. char a=1 ...
- 转:浅谈char类型范围
在 C 语言中, signed char 类型的范围为 -128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是 -128~127,这个问题貌似看起来也很简单容易, 以 ...
- [转载]浅析为什么char类型的范围是 —128~+127
http://blog.csdn.net/daiyutage/article/details/8575248 在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写, ...
随机推荐
- Mybatis源码学习第七天(PageHelper分析)
其实我本来是不打算写这个PageHelper的,但是后来想了想,还是写了吧!现在市场用Mybatis的产品分页应该差不多都是用PageHelper来实现的,毕竟Mybatis的分页rowbound.. ...
- java 将map转为实体类
使用反射将map转为对象,如果不使用反射的话需要一个get一个set写起来麻烦,并且不通用,所以写了一个通用的方法将map集合转为对象,直接看代码,注释也都挺清楚的 public static < ...
- Windows+Git+TortoiseGit+COPSSH安装图文教程
http://blog.csdn.net/aaron_luchen/article/details/10498181/ http://jingyan.baidu.com/article/3a2f7c2 ...
- Navicat 闲置时间过长会卡死
前段时间使用navicat连接线上的数据库,Navicat 闲置时间过长会卡死.解决方案:选中数据库,右键点击 编辑连接,修改保持连接间隔为 20秒.非常 so easy ! 1. 选中数据库,右键点 ...
- git 快速入门及常用命令
身为技术人员,都知道Git是干嘛的.从服务端角度它是代码仓库,可以多人协作.版本控制.高效处理大型或小型项目所有内容:从客户端讲,它能够方便管理本地分支.且与服务端代码的同步,从拉取.合并.提交等等管 ...
- JS -- DOM(文档对象模型)
认识DOM(文档对象模型) DOM(Document Object Model):定义访问和处理HTML文档的标准方法. DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). < ...
- Robotframework自动化4-基础关键字介绍1
前言 上一节已经介绍了APP的启动,那我们就会看到我们引用了一些关键字,对于AppiumLibrary都有哪些常用的关键呢,这一节主要介绍这一部分. AppiumLibrary 常用关键字介绍 1.关 ...
- 突发!美商务部宣布封禁微信,TikTok——面对科技封锁,如何应对
刚刚美国商务部忽然发布了这则新闻,为了回应特朗普2020年8月6号的行政令,称这些应用程序存在安全威胁. 禁令中称,自2020年9月20日起,美国政府将: 1 禁止通过美国在线移动应用程序商店分发或维 ...
- 北京数途科技有限公司--EAM MAXIMO交通行业
北京数途科技有限公司--EAM MAXIMO交通行业 一.行业背景: 自从1863年世界上第一条地铁在英国伦敦建成通车,标志着城市轨道交通方式的诞生.在不同国家.不同发展阶段内,凡经济发达的 国家与城 ...
- 解析nohup java -jar xxx &
一直就知道 java -jar xx ctrl+c就退出了 来自这个文 https://blog.csdn.net/wngpenghao/article/details/83022185 java - ...