当前位置: 首页 > 面试题库 >

使用Integer.parseInt转换32位二进制字符串失败

杜高谊
2023-03-14
问题内容

为什么这部分代码会失败:

Integer.parseInt("11000000000000000000000000000000",2);

Exception in thread "main" java.lang.NumberFormatException: For input string: "11000000000000000000000000000000"

据我了解,整数是32位值。上部代码中的零和一的数目为32。如果有31,则该代码有效。为什么呢?


问题答案:

您的代码失败,因为它尝试解析一个需要33位才能存储为有符号整数的数字。

有符号int是二进制补码表示形式的32位值,其中第一位将指示数字的符号,其余31位将指示数字的值。(-ish。)Java仅支持带符号的整数,并且parseInt()不应该和Friends
一起解析两个补码的位模式-
从而将右边第32位的1or或(可能暗含)解释0为符号。它们旨在支持解析人类可读的表示,这是符号的可选-(或+),后跟数字的绝对值。

在这种情况下,这是一种错误的直觉,导致您期望自己描述的行为:如果您要解析除2以外的 任何
其他基数(或者可能是其他常用的2的幂次基数),您是否期望第一个数字为输入会影响符号吗?显然你不会;比如说,
设计parseInt("2147483648")返回的收益将使PHP疯狂。-2147483648 __

特殊的两重力基础也令人感到奇怪。最好有一种单独的方法来处理位模式,例如此答案中的一种。



 类似资料:
  • 我如何将一个写为二进制的字符串转换为二进制(字节数组)? 如果我有一个字符串: 下面是当我将二进制设置为字节数组时发生的情况(字节数组返回48,这是ASCII) 我不擅长解释,所以希望上面的例子足以告诉你我想要什么。

  • 问题内容: 我想将十六进制字符串转换为二进制字符串。例如,十六进制2是0010。下面是代码: 但是,这仅适用于十六进制0-9;它不适用于十六进制A-F,因为它使用。谁能增强它? 问题答案: 您需要告诉Java int是十六进制的,如下所示:

  • 问题内容: 我发现将十六进制转换为二进制的方式如下: 尽管此方法适用于较小的十六进制数,但以下十六进制数 抛出一个 因此,我编写了以下似乎可行的方法: 上面的方法基本上接受十六进制字符串中的每个字符,并在必要时将其转换为等价的二进制零,然后将其连接到返回值。这是执行转换的正确方法吗?还是我忽略了一些可能导致我的方法失败的事情? 在此先感谢您的协助。 问题答案: 会做你想要的。只需传递2的基数即可。

  • 问题内容: 我需要将二进制字符串转换为十六进制字符串,但是我有问题。我通过这种方法将二进制字符串转换为十六进制字符串: 没关系!但是我丢失了字符串左侧的零。例如: 该方法返回此:123456789ABCDEF,但我想返回此: 00000123456789ABCDEF 问题答案: 而不是我将使用解析值,然后以所需的宽度(在您的示例中为21)输出值:

  • 问题内容: 我也想将我的二进制(在字符串中)转换为十六进制字符串,这只是一个程序片段,因为该程序只是另一个更大程序的一部分: 问题是我不知道填充是否有效,但是我确定该程序返回了二进制字符串的错误十六进制转换,我正在尝试这样做: http://www.wikihow.com/Convert-Binary-to- Hexadecimal PS:我需要实现它(不使用任何内置函数) 问题答案: 如果您不必

  • 问题内容: 是否有任何固定的Python方法将Python中的Integer(或Long)转换为二进制字符串? Google上有无数的dec2bin()函数…但是我希望可以使用内置函数/库。 问题答案: Python的字符串格式方法可以采用格式规范。