我正在使用处理2.2.1 。当我尝试在32位整数上使用unbinary()
时,除了第一个位之外,每个位都可以被翻转。
例如,
int output = unbinary("10000000000000000000000000000000");
这将抛出:
"NumberFormatException: For input string: "10000000000000000000000000000000"
unbinary()
不能处理32位整数吗?
答案 0 :(得分:2)
根据Processing's source,unbinary()
函数会调用Integer.parseInt()
。根据{{3}},Integer.parseInt()
函数需要有符号值。这导致了一个问题,因为32位的输入没有符号,他们有一个符号位。
换句话说,unbinary()
函数不会像处理Java(因此处理器)处理32位int一样处理输入的32位值。
int
可容纳的最大数量为2,147,483,647
。您的输入二进制值转换为2,147,483,648
,超出限制。
但该值是32位数的二进制数!那不是一个32位整数吗?
unbinary()
函数将二进制值视为"人类可读",这意味着它需要一个负数的符号。因此它接受-101
之类的内容来表示二进制中的-5
。但在幕后,并不是如何处理负二进制值。 Java使用the Java API来表示负数,这意味着-5
由二进制的11111111111111111111111111111011
表示。
它有点复杂,但基本上是:如果二进制数以1
开头,则表示它是负数。
因此,10000000000000000000000000000000
的输入值仅以机器可读格式评估int
的最低-2,147,483,648
值,但。 {{1}函数将它视为"人类可读"格式,这就是你得到差异的原因。
如何解决此问题?
这实际上取决于你需要从二进制到整数的原因。但是你可能会使用unbinary()
函数,它会在机器可读的"机器可读中使用二进制值。格式:
Integer.parseUnsignedInt()