日期:2014-05-18  浏览次数:20725 次

仅有的38分贡献出来: int值为46018,转为为short,为何得到-19518?

Java代码:

int iiiii=46018;
short ttttt=(short)iiiii;
System.out.println(ttttt);

输出的结果是:-19518


同样的代码在C#中也一样。但是查看MSDN帮助:MSDN说

如果整数的长度超过了 short 存储位置的大小,则将产生编译错误。

http://msdn.microsoft.com/zh-cn/library/ybs77ex4.aspx



我想知道这是为什么?

------解决方案--------------------
引用:
Java代码:

int iiiii=46018;
short ttttt=(short)iiiii;
System.out.println(ttttt);

输出的结果是:-19518


同样的代码在C#中也一样。但是查看MSDN帮助:MSDN说

如果整数的长度超过了 short 存储位置的大小,则将产生编译错误。

http://msdn.microsoft.co……


46018 换成二进制为 1011 0011 1100 0010
SHORT类型能存储的最大正整数为32767 即0111 1111 1111 1111
显然,46018转换成SHORT类型之后第一位为符号位,即为负数,计算机实际存储的数为1100 1100 0011 1101
(反码)就是-19518了。
------解决方案--------------------
数字有点大,转换算起来有点麻烦,索性就写了一个类来算。


package com.zf.maven.test;

import java.math.BigInteger;


/**
 */
public class Test02 {

public static void main(String[] args) {
String e = _10_2(46018 ,32);
System.out.println("46018转换为二进制:" + e);  
e = e.substring(16);
System.out.println("因为sort为2个字节 也就是16位的,所以取16位得到:" + e);
System.out.println("接下来就将二进制转换为十进制");
System.out.println("可以看到最高位(符号位)为1 ,为负数 。将负二进制数转换为十进制的步骤为 1、取反  2、加1   3、转换为十进制   4、还原符号");
String f = e.replace("0", "x")
.replace("1", "0")
.replace("x", "1");
System.out.println("首先需要取反得到:" + f);
f = eadd(f);
System.out.println("然后让取反的结果加上1,得到:" + f);
int result = _2_10(f);
System.out.println("将"+ f +"转换为十进制的结果为:" + result);
System.out.println("然后要恢复原来的符号,在前面加上负号,最终的到的结果为:-" + result);  

}

/**  
 * 二进制转换为10进制
 * @param e
 * @return
 */
public static int _2_10(String e){
int result = 0 ;
StringBuilder sb = new StringBuilder(e);
sb.reverse();
for (int i = 0 ; i < sb.length() ; i++) {
if(sb.charAt(i) == '1'){
result += cf(i);
}else{
result +=  0 * cf(i);
}
}
return result ;
}
  
/**
 * 将十进制数字转换为二进制格式
 * @param t 十进制数字
 * @param bits 位数
 * @return
 */
public static String _10_2(int t , int bits){
StringBuilder sb = new StringBuilder() ;
while(t != 0){
if(t % 2 != 0)
sb.append(1);
else
sb.append(0);
t /= 2;
}
sb.reverse() ;
return String.format("%0"+ bits +"d",  
new BigInteger(sb.toString()));
}

/**
 * 二进制数加1
 * @param s
 * @return
 */
public static Stri