jdk源码:Long.toString(long i, int radix)和Long.toUnsignedString(long i, int radix)

1. 区别

toString方法将数字转为有符号数对应的字符串,toUnsignedString是将数字转为有符号数对应的字符串。

2. toString(long i, int radix)

public static String toString(long i, int radix) {
        if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
            radix = 10;
        if (radix == 10)
            return toString(i);
        char[] buf = new char[65];
        int charPos = 64;
        boolean negative = (i < 0);

        if (!negative) {
            i = -i;
        }

        while (i <= -radix) {
            buf[charPos--] = Integer.digits[(int)(-(i % radix))];
            i = i / radix;
        }
        buf[charPos] = Integer.digits[(int)(-i)];

        if (negative) {
            buf[--charPos] = '-';
        }

        return new String(buf, charPos, (65 - charPos));
    }
    public static String toString(long i) {
        if (i == Long.MIN_VALUE)
            return "-9223372036854775808";
        int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
        char[] buf = new char[size];
        getChars(i, size, buf);
        return new String(buf, true);
    }
  • 当非10进制的时候
boolean negative = (i < 0);
if (!negative) {
            i = -i;
        }

        while (i <= -radix) {
            buf[charPos--] = Integer.digits[(int)(-(i % radix))];
            i = i / radix;
        }
        buf[charPos] = Integer.digits[(int)(-i)];

        if (negative) {
            buf[--charPos] = '-';
        }

这里有个比较巧妙的地方我开始没有想通,就是为什么把数字都统一转为负数来处理呢。首先肯定是统一转为正数或者负数处理,那为什么是负数。答案就是有负数数字负数比负数多一个数字,比如64位系统Long的范围是-9223372036854775808 ~ 9223372036854775807。当遇到Long最大正数9223372036854775807时,可以转为-9223372036854775807,但是当你遇到Long最小负数-9223372036854775808时转为正数就会溢出。所以统一转为负数处理可以多处理一个数。

3. toUnsignedString(long i, int radix)

    public static String toUnsignedString(long i, int radix) {
        if (i >= 0)
            return toString(i, radix);
        else {
            switch (radix) {
            case 2:
                return toBinaryString(i);

            case 4:
                return toUnsignedString0(i, 2);

            case 8:
                return toOctalString(i);

            case 10:
                /*
                 * We can get the effect of an unsigned division by 10
                 * on a long value by first shifting right, yielding a
                 * positive value, and then dividing by 5.  This
                 * allows the last digit and preceding digits to be
                 * isolated more quickly than by an initial conversion
                 * to BigInteger.
                 */
                long quot = (i >>> 1) / 5;
                long rem = i - quot * 10;
                return toString(quot) + rem;

            case 16:
                return toHexString(i);

            case 32:
                return toUnsignedString0(i, 5);

            default:
                return toUnsignedBigInteger(i).toString(radix);
            }
        }
    }

作者 @没有故事的老大爷
一定要专注,这样才会忘记痛苦

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Integer类为java基本类型int的包装类,除了前面提到的Byte类,Short类中的大部分方法,Integ...
    Kinsanity阅读 981评论 0 2
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,686评论 0 13
  • byte即字节的意思,java中的基本类型之一、也是java中长度最小的基本数字类型,通常在读取文件时需要用字节数...
    Kinsanity阅读 1,298评论 0 5
  • 2012年9月,在杭州,我失业,带着仅剩下的3万元存款,去川北藏区徒步,回来参加了一个课程,交完学费,剩下1000...
    建琪觉醒阅读 1,463评论 4 49
  • 812 世界大象日 昨天夜里,和小伙伴聊着聊着说到了动物保护的话题。起因是她让我看了一段令人心寒的...
    小琪是我的小名阅读 588评论 0 0

友情链接更多精彩内容