.Net中的数字类型四则运算的有趣问题
来源:互联网 发布:nginx配置location详解 编辑:程序博客网 时间:2024/04/19 12:27
看看下面的代码:
sbyte sba, sbb,sbv;
sba = 1;
sbb = 2;
sbv = sba + sbb;
byte ba, bb, bv;
ba = 1;
bb = 2;
bv = ba + bb;
short sa, sb, sv;
sa = 1;
sb = 2;
sv = sa + sb;
ushort usa, usb, usv;
usa = 1;
usb = 2;
usv = usa + usb;
MessageBox.Show(string.Format("{0},{1},{2},{3}", sbv, bv, sv, usv));
你觉得这段代码能否正确执行?结果会怎样?
用VS2005打开项目测试一下你就会发现,这段代码会出现编译错误.
正确的代码应该如下:
sbyte sba, sbb,sbv;
sba = 1;
sbb = 2;
sbv = (sbyte)(sba + sbb);
byte ba, bb, bv;
ba = 1;
bb = 2;
bv = (byte)(ba + bb);
short sa, sb, sv;
sa = 1;
sb = 2;
sv = (short)(sa + sb);
ushort usa, usb, usv;
usa = 1;
usb = 2;
usv = (ushort)(usa + usb);
MessageBox.Show(string.Format("{0},{1},{2},{3}", sbv, bv, sv, usv));
这是什么原因呢?
其实CLR底层只支持 int,int64,native int, float , double几种数据类型.
像上面的sbyte,byte,short,ushort, clr底层是不支持的,在底层这些类型是用int表示的.
CLR的堆栈中压入的数字,最小是4字节,小于4字节的会根据其类型进行符号扩展或者0扩展为4字节int型.
这样四则运算的结果也是int型,最后再赋值需要进行强制类型转换.
分析一下编译后的IL代码就清楚了.
下面这个代码为什么能编译呢?
short sb;
sb=2;
sb += 1;
其实编译后的IL代码中最后赋值也包含了类型转换操作.
应该是编译器自动识别,然后自动添加的类型转换操作.
但是像上面的代码也编译出错,这个也能进行类型推断,自动添加数据类型转换啊.
不知道微软这么设计是bug还是基于其它因素的考虑?
- .Net中的数字类型四则运算的有趣问题
- 关于矩阵数字的两个有趣问题
- 引用类型(一个有趣的问题)
- 大数字的加减乘除四则运算
- 有趣的数字"7"
- 有趣的数字 6174
- 有趣的数字
- 有趣的数字图形
- 有趣的数字
- 关于打印一个有趣的数字图形的问题
- PAT乙级 1019. 数字黑洞 (20) 有趣的数学问题
- Java中的浮点型进行四则运算精度丢失的问题
- 有趣的浮点类型
- 有趣的python:关于python中的整数类型对象
- 引用类型的赋值问题--.net 中的Deep Clone
- 宇宙:一些有趣的数字
- [编程题] 有趣的数字
- [编程题] 有趣的数字
- SQL Server数据库技术(96)
- SQL Server
- javascript的window.prompt使用详解
- Linux 远程目录复制SCP
- 精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
- .Net中的数字类型四则运算的有趣问题
- Tomcat下运行servlet
- 判断素数(C#)
- 找对像的几种方法
- 如何选择一个男孩儿的英文名字?
- 我的观点
- 强人对初中英文课本的解析(很有道理的说,让我们一起说what is your name)
- 对于同一工作组下,不同机器之间如何利用Private Queue
- 学习EXTJS2