为啥java在改变基数之前将数字转换为负数

Posted

技术标签:

【中文标题】为啥java在改变基数之前将数字转换为负数【英文标题】:Why java is converting number to negative before change of radix为什么java在改变基数之前将数字转换为负数 【发布时间】:2021-04-12 09:15:27 【问题描述】:

在 Java 中,String Integer::toString(long i, int radix) 使用给定的基数(基数)返回数字 i 的表示形式。在进行转换之前,它会将编号 i 映射到 -i

byte[] buf = new byte[65];
int charPos = 64;
boolean negative = (i < 0);

if (!negative) 
    i = -i;


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

buf[charPos] = (byte)Integer.digits[(int)(-i)];

我不明白为什么它使用负数而不是正数。在 Java x % y = -((-x) % y) 中,这让我很困惑,因为它不应该有任何区别,因为模运算的结果在代码中被否定了。

【问题讨论】:

这是Integer.toString还是Long.toString的来源? "In Java x % y = (-x) % y" 你确定吗? ideone.com/1eOX4R 7 % 10-7 % 10 非常不同(与 3 % 10 一致)。 @luk2302 你确定吗? -7 % 10 == -(7 % 10),如ideone.com/WqQrlU所示。 @luk2302 Wolfram Alpha 不是 Java。 【参考方案1】:

代码不想区别处理正负值,所以想统一符号。

最明显的标准化是将负值转换为正值。这就是我们人类会做的。但是,对于存储在二进制补码中的数字,负数的 取值范围 比正数的取值范围大一,所以如果我们归一化为正数,-2147483648 也就是 @ 会失败987654322@.

【讨论】:

这令人印象深刻。你是怎么知道的? @Trismegistos 我刚刚考虑了这个问题:int 中的负值有什么特别之处。当您之前处理过边缘案例时,-2147483648 没有积极对应的事实就很明显了。

以上是关于为啥java在改变基数之前将数字转换为负数的主要内容,如果未能解决你的问题,请参考以下文章

将基数为 10 的数字转换为 .NET 中任何基数的最快方法?

在JAVA中从基础X转换为基础Y返回的不同于PHP中的相同函数

javascript 将数字转换为基数64

将一个以 10 为底的数字转换为 N

JavaScript中将字符串类型转换为整形的函数

将代码从5位转换为3位字符