一、开头
Java是一种强类型的语言,这意味着必须为每一个变量声明一种类型
Java中一共有8种基本数据类型(整形有4种,浮点型有2种,字符型1种,还有一种布尔类型)
由于Java程序必须保证在所有机器上都能得到相同的运行结果,所以各种数据类型的取值范围必须是固定的
二、整形
整形共有4种
- byte:一个字节
- short:2个字节
- int:4个字节(刚好超过二十亿)
- long int:8个字节
这里要注意的一些地方是
- 长整形数值有一个后缀L或者l
- 十六进制数值有一个前缀0x或者0X
- 八进制有一个前缀0(容易混淆,不推荐使用)
- 从Java7(JDK1.7)开始可以使用0b或者0B写二进制
- 从JAVA7开始,还可以为数字字面量加下划线,如使用1_000_000表示100W(Java编译器会去除这些下划线)
开头已经说了,各种数据类型的取值范围必须是固定的,所以4种整形的范围都为有符号位的范围,Java也因此没有Unsigned符号。
所以针对Unsigned的整形,基本数据类型的包装类有对应的API的
这里首先要认识的一点是,只要不溢出,加法、减法和乘法都能正常计算,但除法是会出问题的
三、Byte.toUnsignedInt
这个API的功能是针对Unsigned的Byte的转化成Unsigned
可以看到同样也是转化成更高位去处理
六、Long.divideUnsigned
现在Long没有更高位了怎么办呢?
下面是源码
public static long divideUnsigned(long dividend, long divisor) { //divisor是除数 //而divident是被除数 //首先判断除数是否为Unsigned(<0就代表为unsigned,只不过将符号位看成1,变为负数) if (divisor < 0L) { // signed comparison // Answer must be 0 or 1 depending on relative magnitude // of dividend and divisor. //可以看到这里的返回值只有0和1 //这是因为除数为unsigned,根据整形的向下取整规则 //得到的结果只能为1和0(dividend大于divisor就为1,小于就为0) //dividend不可能为divisor的两倍(因为位数不过) return (compareUnsigned(dividend, divisor)) < 0 ? 0L :1L; } //如果除数不是Unsigned,那么就判断被除数 if (dividend<strong style="color:transparent">来2源gaodaima#com搞(代@码&网</strong> > 0) // Both inputs non-negative //如果被除数不是Unsigned,就直接除就好 return dividend/divisor; else { /* * For simple code, leveraging BigInteger. Longer and faster * code written directly in terms of operations on longs is * possible; see "Hacker's Delight" for divide and remainder * algorithms. */ //如果是,那么就将除数和被除数换成更高位的BigInt型,去进行 return toUnsignedBigInteger(dividend). divide(toUnsignedBigInteger(divisor)).longValue(); } }