About unsign in Java

1.

java的数据类型都是有符号的,byte在java中的范围是-128~127,而在c#中byte范围是0~255,一直不明白,为何java的数据类型没有无符号的类型,难道在java中不需要用无符号的类型?
很显然,C#中的byte型,在java中只能用short来取,这不明显浪费吗,还是java这样做是有其它的考虑?

2.

看到一段关于java无符号数据类型的说法,不太明白:
Java的设计者感到无符号整数是不必要的。具体地说,他们感到无符号(unsigned)概念主要被用来指定高位(high-orderbit)状态,它定义了当int表示一个数字时的符号。你将在第4章中看到,Java对高位含义的管理是不同的,它通过增加一个专门的“无符号右移”运算符来管理高位。这样,就不需要无符号整数了。

3.

C++中的DWORD为32位无符号整数, 但在java中,就不能用int类型表示了,得用long,因为java中的int要包含负数,如果把C++中的DWORD直接转为java的int,超过Integer.MAX_VALUE的值就会变成负数
从网上找来的代码,地址忘了,再贴上来吧

public static long getAs4Byte(final ByteBuffer buf, ByteOrder byteOrder) {
byte[] bytes = new byte[4];
buf.get(bytes);
StringBuilder builder = new StringBuilder();
String tmp = "";
if (ByteOrder.BIG_ENDIAN.equals(byteOrder)) {
for (int i = 0; i < bytes.length; i++) {
// java中byte的最大值是127,读取到的byte可能大于127,经过转换会变成负数.
tmp = Integer.toHexString(bytes[i] & 0xFF);// 所以在这里处理一下.
builder.append(tmp.length()==1?"0"+tmp:tmp);
}
} else {
for (int i = bytes.length - 1; i >= 0; i--) {
builder.append(Integer.toHexString(bytes[i] & 0xFF));
}
}
long value = new BigInteger(builder.toString(), 16).longValue();
return value;
}

原文地址:https://www.cnblogs.com/qiengo/p/2527973.html