• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Java数据类型之细讲char类型与编码关系

java 搞代码 4年前 (2022-01-09) 16次浏览 已收录 0个评论
文章目录[隐藏]

一、开头

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();
        }
    }

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Java数据类型之细讲char类型与编码关系

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址