最近在学java,突然发现一个细节。short y = 1;y += 1; 这两行代码无论在java 还是c#中都可以编译通过,相同的 short y = 1;y =y+ 1;都不能编译通过,原因是 int 不能隐式转化为short,
但是 int i = 1;i *=0.1; 这两行代码在java是完全可以编译通过,在c#中确实不行,请大神们,解答。。。
问了同事,java中复制运算是会自动截取数据,超出范围的会被截取掉,c#中编译器是检查数据的范围,不符合类型范围的编译错误,不做截取。。
你把double转成int当然编译不通过
short y = 1;y += 1 为什么 int可以转化为short呢? 高精度也不能隐式转化为低精度啊
0.1 是 double 類型;
i*0.1 的結果也是 double 類型;
而 i 是 int,double 不能隐式转化为int;
都没没说到点子上.
short和int都是整形,机内存储格式是一样的.只是长度不一样.所以可以安全截断
double是浮点型,机内格式和整数是2个概念.所以不能安全截断,一定会出现精度丢失.
至于为什么java允许这样做.说明java是个不严谨的语言..
百度下 整数和浮点数的机内表示.
int 是单精度 double和short 是双精度。在内存中int是4个字节而double和short是8个字节。。通俗的话说你一个大的箱子去装小的箱子可以装进去。但是你一个小的箱子可以去装大的箱子吗。。