小编给大家分享一下Java数据类型之细讲字符类型与编码关系是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
一、开头
Java是一种强类型的语言,这意味着必须为每一个变量声明一种类型
Java中一共有8种基本数据类型(整形有4种,浮点型有2种,字符型1种,还有一种布尔类型)
<强>由于Java程序必须保证在所有机器上都能得到相同的运行结果,所以各种数据类型的取值范围必须是固定的强>
二、整形
整形共有4种
- <李>
字节:一个字节
李> <李>短:2个字节
李> <李>int: 4个字节(刚好超过二十亿)
李> <李>长int: 8个字节
李>这里要注意的一些地方是
- <李>
长整形数值有一个后缀L或者L
李> <李>十六进制数值有一个前缀0 x或者0 x
李> <李>八进制有一个前缀0(容易混淆,不推荐使用)
李> <李>从Java7 (JDK1.7)开始可以使用0 b或者0 b写二进制
李> <李>从Java7开始,还可以为数字字面量加下划线,如使用1 _000_000表示100 w (Java编译器会去除这些下划线)
李>
开头已经说了,各种数据类型的取值范围必须是固定的,所以4种整形的范围都为有符号位的范围,Java也因此没有Unsigned符号。
所以针对无符号的整形,基本数据类型的包装类有对应的API的
这里首先要认识的一点是,<强>只要不溢出,加法,减法和乘法都能正常计算,但除法是会出问题的强>
三、字节。toUnsignedInt
这个API的功能是针对无符号的字节的转化成无符号
从源码上看,其实就是将其强制转换成int,相当于扩大了位数,然后通过与上0 xff, 0 xff是十六进制,转化成二进制就是11111111,这个与运算的作用其实为了限制位数,因为字节是1个字节,顶多只有8位,超过8位的那些都不要,对于无符号来说,应该都为0。
四、整数。divideUnsigned
这个API的功能是针对无符号的整数类型除法的
可以看的到,他的处理与字节一样,都是转化成更高位的类型,这里转化成长,然后通过与运算舍弃后面多出来的位数(其实是改为0)
五、整数。remainderUnsigned
这个是用来求余数的
可以看到同样也是转化成更高位去处理
六、长。divideUnsigned
现没在长有更高位了怎么办呢?
下面是源码
, public static long divideUnsigned (long ,股息,long 因子),{ ,,,,,,,//除数是除数 ,,,,,,,//而股利是被除数 ,,,,,,, ,,,,,,,//首先判断除数是否为无符号(& lt; 0就代表为无符号,只不过将符号位看成1,变为负数) ,,,,,,,if (divisor & lt;, 0 l), {,//signed 比较 ,,,,,,,,,,,//,Answer must be 0, 1,趁机depending 提醒relative 大小 ,,,,,,,,,,,//,of dividend 以及因子。 ,,,,,,,,,,, ,,,,,,,,,,,//可以看到这里的返回值只有0和1 ,,,,,,,,,,,//这是因为除数为无符号,根据整形的向下取整规则 ,,,,,,,,,,,//得到的结果只能为1和0(股息大于因子就为1,小于就为0) ,,,,,,,,,,,//股息不可能为因子的两倍(因为位数不过) ,,,,,,,,,,,return (compareUnsigned(股息,除数)),& lt;, 0, ?, 0 l : 1 l; ,,,,,,,} ,,,,,,,//如果除数不是无符号,那么就判断被除数 ,,,,,,, ,,,,,,,if (dividend 祝辞,0),//,,Both inputs 非负 ,,,,,,,,,,,//如果被除数不是无符号,就直接除就好 ,,,,,,,,,,,return 股息/因子; ,,,,,,,else { ,,,,,,,,,,/* ,,,,,,,,,,,,*,For simple 代码,,leveraging BigInteger只Longer 以及更快 ,,,,,,,,,,,,*,code written directly 拷贝terms of operations 提醒longs ,,,,,,,,,,,,*,可能,,阅读“黑客# 39;s Delight" for divide 以及其他信息 ,,,,,,,,,,,,*算法。 ,,,,,,,,,,,*/,,,,,,,,,,,,//如果是,那么就将除数和被除数换成更高位的BigInt型,去进行 null null null null nullJava数据类型之细讲字符类型与编码关系是什么