char类型的数值转换
在视频教程中,你已经认识到了数字类型之间、字符串和其他类型之间的转换。而某些时候,我们还需要将char类型转换为int类型,或者把int类型转换为char类型。
这篇文章,将介绍在代码中虽然不太常用,但也需要了解的知识。
char转为int
一个字符 ‘汉’ 怎么可能转换为数字呢?
实际上是可以的,在之前的补充资料中已经说到,计算机对字符的存储,是使用某种编码规则对应的数字来存储的。
在C#语言中,使用Unicode编码来存储字符。
比如汉字 ‘汉’,对应的Unicode编码是27721,在计算机内存中,将使用汗27721对应的二进制来存储。
因此,如果要把 ‘汉’ 转换为int类型的数字,转换的结果就是27721。
那使用什么样的代码来完成该转换呢?
char类型的任何数据都可以隐式的转换为int类型。
既然是隐式转换,所以,下面的代码都是正确的:
char c = '汉';
int n = c;
Console.WriteLine(n);
n = 'a';
Console.WriteLine(n);
运行上面的代码,会输出:
27721
97
说明 ‘汉’ 和 ‘a’ 在Unicode编码中分别是27721和97。
为什么char类型的数据赋值给int类型的变量可以使用隐式转换呢?
是因为char类型的数据在内存中存储时使用的是Unicode编码,Unicode编码占16位(两个字节),而int类型占32位(4个字节)。因此,char类型的数据占位少,取值范围小,而int类型的数据占位多,取值范围大。所以,这样的赋值是安全的,不会造成数据丢失,可以隐式转换。
int转为char
比如,我有一个int类型的变量27721,我想看看这个数字作为编码,对应的字符是什么?
这种情况,就需要把int类型的数据转换为char类型。
int类型的数据转换为char类型时必须使用显示转换。
为什么必须使用显示转换呢?如果你看懂了char转为int一节,应该明白原因。
char类型的取值范围小于int,因此,将取值范围大的int类型转换为取值范围小的char类型是不安全的,所以要用显示转换。
下面的代码,是查看27721和97两个数字所代表的字符:
int n = 27721;
char c = (char)n;
Console.WriteLine(c);
c = (char)97;
Console.WriteLine(c);
字符数据的运算
char类型的数据,在进行数学运算(+、-、*、/、%)时,会将它当做int进行运算,运算的返回类型是int。
也就是说,字符也可以参与数学运算,在运算的时候,会把这个字符的编码进行运算,运算的返回结果是一个整数int。
比如,’a’+’1’,这个代码计算的是’a’的编码加上’1’的编码,返回的是编码相加的整数。’a’的编码是97,’1’的编码是49,计算结果是一个int类型的整数146。
下面的代码可以很好的说明这一点。
int a = 'a'+'1';
Console.WriteLine(a);
运行后会输出146。
再比如,想想下面的代码运行后会输出什么呢?
int a = 'a'+1;
char c = (char)a;
Console.WriteLine(c);
分析一下:
- ‘a’+1,是将a的编码加上1,结果为98,将98保存到变量a中。
- 然后,将98转换为对应的字符,转换的结果就是字符’b’,将其保存到变量c中。
- 最后输出变量c,就输出了字符b。
char类型的数据,在进行数学运算(+、-、*、/、%)时,会将它当做int进行运算,运算的返回类型是int。这种做法,叫做自动类型提升,实际上,不仅仅是char,取值返回比int类型小的数字类型,比如byte、short,它们也适用于自动提升规则。
比如,两个byte类型的变量进行数学运算时,也会将它们当做是int类型运算,返回结果也是int。
byte s1 = 2, s2 = 3;
byte s3 = s1 + s2;上面的第二句代码会报错,提示你int无法赋值给byte。就是因为两个byte的变量s1和s2,在进行数学运算时,会提升为int类型,它们计算的结果是一个int类型,不能隐式转换赋值给byte类型的变量s3。
之所以这样做,是因为像byte这些取值范围很小的类型,如果不提升,它们在运算时经常会导致结果超过其取值范围,超过的部分丢失掉了,得到了错误的数据。而提升为取值范围更大的int类型后,会在很大程度上解决这一问题。
char类型的数值转换的更多相关文章
- NSString / NSData / char* 类型之间的转换
转自网络: NSString / NSData / char* 类型之间的转换 1. NSString转化为UNICODE String: (NSString*)fname = @“Test”; ch ...
- java如何将char类型的数字转换成int型的数字,而不是Ascii
如何把 char ‘3’ 转为 int 3, 大家应该知道,不能直接转化,那样得到是‘3’的Ascii. 如下面: public class Leet { public static void mai ...
- NSString、NSData、char* 类型之间的转换-备
1. NSString转化为UNICODE String: (NSString*)fname = @“Test”; char fnameStr[10]; memcpy(fnameStr, [fname ...
- 【转】NSString / NSData / char* 类型之间的转换
原文 :http://www.cnblogs.com/pengyingh/articles/2341880.html NSString 转换成NSData 对象 NSData* xmlData = [ ...
- 转:NSString / NSData / char* 类型之间的转换
1. NSString转化为UNICODE String: (NSString*)fname = @“Test”; char fnameStr[10]; memcpy(fnameStr, [fname ...
- char 类型的数组转换到CSting
首先,字符串“abc”在CString的保存格式是‘a’,'\0','b','\0','c','\0','\0','\0'; 从中可以看出它是以‘\0’,'\0',结束的. 当char ch[6]: ...
- 【Java】 int与char类型间的相互转化
在[Java] 剑指offer(16) 打印1到最大的n位数中遇到了int类型与char类型之间的转换,这里总结一下. (1)int类型转char类型,将数字加一个‘0’,并强制类型转换为char即可 ...
- string 转换char类型
将string转换成char类型 const char *c = string.c_str() char转换string char *c_name = "char" string ...
- Char类型与Sting类型的数字字符转换时的不同点
这是在一次编程时的bug里偶然发现的一个问题.在C#中,单引号默认是char类型字符,而双引号默认是string类型字符.对于char类型的数字字符,通过强制类型转换或者convert转换,转换成的整 ...
随机推荐
- 理解socket.io(一)---相关的API
理解socket.io(一)---相关的API 1. 什么是Socket.IO?Socket.IO是node.js的一个模块,它用于浏览器与服务端之间实时通信.它提供了服务器和客户端的组件,只需一个模 ...
- 在windows端使用jupyter notebook,服务器充当后台计算云端 简化描述
在CentOS7服务器端启动jupyter notebook服务,在windows端使用jupyter notebook,服务器充当后台计算云端 简化描述 CentOS7服务器端 jupyter no ...
- HDU1233(Kruskal&Prim两解)
https://vjudge.net/problem/HDU-1233 还是畅通工程 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以 ...
- 置顶博客一览表($My~Top~List$)
咳,主要是因为我觉得置顶博客太多了让人很晕233 以下是(伪)置顶的博客: 笙上月 \(\color{red}{Link}\) 笔下梅 \(\color{red}{Link}\) 老年\(OIer\) ...
- 【原创】MVC +WebUploader 实现分片上传大文件
大文件的上传是我一直以来想学习的一个技术点,今天在项目闲暇之时,终于有机会自己尝试了一把,本文仅仅是个Demo,各种错误处理都么有,仅限于大家来学习思路. 参考博文:http://www.cnblog ...
- Linux集锦
一:Linux文件系统 Linux系统有一个重要概念:一切都都式文件. Linux支持五种文件类型: Linux的目录结构如下: 常见目录说明: /bin: 存放二进制可执行文件(ls,cat,mkd ...
- Luogu1514 NOIP2010 引水入城 BFS、贪心
传送门 NOIP的题目都难以写精简题意 考虑最上面一排的某一个点对最下面一排的影响是什么样的,不难发现必须要是一段连续区间才能够符合题意. 如果不是一段连续区间,意味着中间某一段没有被覆盖的部分比周围 ...
- angularjs的$window功能小练习
我们想在一个文本框输入一些文字,然后点击铵钮,alert()出来. <div ng-app="alertApp" ng-controller="alertContr ...
- WPF中的DoubleAnimation
原文:WPF中的DoubleAnimation WPF中的DoubleAnimation ...
- daterangepicker双日历插件的使用
今天主要是由于项目的需要,做了一个daterangepicker双日历插件,做出来的效果如下: 个人感觉这个daterangepicker双日历插件很好用,并且实现起来也不是很麻烦,我是根据它的官方文 ...