警惕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,每本教科书上也这么写, ...
随机推荐
- Linux服务器被入侵后的处理过程
突然,频繁收到一组服务器 ping 监控不可达邮件,赶紧登陆 zabbix 监控系统查看流量状况. 可见流量已经达到了 800M 左右,这肯定不正常了,马上尝试 SSH 登陆系统,不幸的事,由于网络堵 ...
- 发布jar包到服务器读取resource目录下文件
* 解决:当项目打包成jar之后resources路径下面的证书文件访问不到* 思路:* 1.运行时先复制一个jar* 2.将复制的jar解压到jar文件目录* 3.删除复制的jar跟解压的非证书文件 ...
- python应用 处理excel数据
实现功能 excel表格中有4列数,分别为RMF计算得到的 β,γ,势能面及组态,需要挑选出相同 β 值下势能面最低时的组态.为了减小数据量,先将 β 值保留两位小数. 代码 import xlrd ...
- Web_php_unserialize 攻防世界
1.$var输入处有一个正则过滤 2._wakeup处需要过滤 编写脚本如下 后在网页输入?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4Oi ...
- PhpStorm license server(版权许可服务器)在线激活服务器集群列表
原文链接:https://bingyishow.top/easy/55.html 服务器列表 序号 服务器(域名) 状态 1 http://www.yuanzhaoyi.cn 在线 2 http:// ...
- vue-element-admin实战 | 第二篇: 最小改动接入后台实现根据权限动态加载菜单
一. 前言 本篇基于 有来商城 youlai-mall微服务项目,通过对vue-element-admin的权限菜单模块理解个性定制其后台接口,实现对vue-element-admin工程几乎不做改动 ...
- MySQL<=>是什么鬼
官网描述 NULL-safe equal. This operator performs an equality comparison like the = operator, but returns ...
- 设计模式 | Catalog设计模式,抵御业务方需求变动
大家好,这是一个全新的专题--设计模式. 其实可以选择的专题还有好几个,为什么选择设计模式呢?原因也很简单,首先是设计模式简单.易学.干货的文章固然好,但是普适性往往不强.另外一个很重要的点就是设计模 ...
- Docker实战(6): 导出docker镜像离线包
前言 离线环境安装Docker 镜像,我已知两种情况,以下操作我将采用在可访问外网的机器上通过镜像迁移的方式来给离线环境安装. 环境:服务器node1可访问外网.服务器node2无法访问外网 两台机器 ...
- 现代C++教程:高速上手(四)-容器
1.线性容器 std::array与std::vector不同的是,array对象的大小是固定的,如果容器大小是固定的,那么可以优先考虑使用std::array容器. 由于std::vector是自动 ...