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
我想知道这是为什么?
------解决方案--------------------
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 String eadd(String s){