为什么在JavaSRC中整数类的toString方法中使用负int作为mod操作

为什么在JavaSRC中整数类的toString方法中使用负int作为mod操作,java,tostring,modulo,Java,Tostring,Modulo,当我阅读java版本1.7.0_09的源代码时,我发现Integer类的toString方法的实现使用负int来计算mod运算,这有什么意义吗?代码如下: public static String toString(int i, int radix) { if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) radix = 10; /* Use the faster vers

当我阅读java版本1.7.0_09的源代码时,我发现Integer类的toString方法的实现使用负int来计算mod运算,这有什么意义吗?代码如下:

public static String toString(int i, int radix) {

    if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
        radix = 10;

    /* Use the faster version */
    if (radix == 10) {
        return toString(i);
    }

    char buf[] = new char[33];
    boolean negative = (i < 0);
    int charPos = 32;

    if (!negative) {     
        i = -i;                //***** change i to negative
    }

    while (i <= -radix) {
        buf[charPos--] = digits[-(i % radix)];   //***** change back to positive after 
                                                 //***** mod operation
        i = i / radix;
    }
    buf[charPos] = digits[-i];

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

    return new String(buf, charPos, (33 - charPos));
}
公共静态字符串到字符串(int i,int基数){
if(基数Character.MAX_基数)
基数=10;
/*使用更快的版本*/
如果(基数==10){
返回字符串(i);
}
char buf[]=新字符[33];
布尔负=(i<0);
int charPos=32;
如果(!负){
i=-i;//****将i更改为负值
}

而(i根据算法,您需要一个小的(
)非负整数流,这些非负整数将用从右到左的数字填充字符缓冲区。标准的小学方法是在数字的开头放一个符号,然后打印数字的绝对值

但是想象一下,如果规则是,
i
在该循环中始终是正的:

if (negative) {
    i = -i; // change i to positive
}
如果
i
恰好是
Integer.MIN\u值
,那么
-i
也恰好是
Integer.MIN\u值
。整数变量可以存储。但是,如果不变量是
i
始终是负绝对值,它将始终适合
int

为什么不直接使用
Math.abs()
if
块呢?很自然,在许多计算机程序中,整数转换成字符串的频率非常高,因此尽可能快地保持
toString
是很有用的。问题是,
Math.abs()和
if
语句在编译为机器代码时可能会被编译为使用分支指令。这可能会干扰;因此,在关注性能时,可能会选择从循环中删除
if
语句

注意:这种优化很少是个好主意!除非您的代码被频繁调用(如此代码),或者您正在构建一个包含大量用户和少量读者/修改者(如此代码)的库,否则性能增益微乎其微,它使代码更难阅读、理解和更改。通过进行此优化,Java工程师可能会略微加快代码的速度,但如果您在编写的代码中使用类似的技术,您的同事/评分员可能不会问堆栈溢出为什么您的代码如此难以理解。:)


TL;DR:只是一个有根据的猜测,但这是两种互补数学和代码优化的结合。

Thx很多!我想这就是我想要的!