使用 java 和 python 将字符串 long 解析为 int

Parsing string long to int with java and python

我正在尝试将一些 java 代码转换为 python。我对以下 java 行有疑问:

int toto = (int)Long.parseLong("11101101111110100111001110011010",2);
String result = Integer.reverseBytes(toto);

在 java 中,我得到了这些结果:

Long.parseLong("11101101111110100111001110011010",2) = 3992613786
(int)Long.parseLong("11101101111110100111001110011010",2) = -302353510
Integer.reverseBytes(toto) = -1703675155

我想我理解了第一行,但为什么这里有一个“(int)”?它应该做什么? (我是 java 和字节管理方面的初学者,我找不到关于这一点我理解的任何文档)。

在 python 中,我设法通过转换为基数 2 获得了第一个结果(我完全是偶然发现的):

int("11101101111110100111001110011010",2) = 3992613786

但是我怎样才能得到“int”的结果,然后得到“reverse byte”的结果python?

(对了,我用的是Python3)

Java Long class 的 parseLong() 方法用于将 CharSequence 参数解析为具有指定基数的带符号 long,从指定的 beginIndex 并扩展到 endIndex-1,通过观察方法签名,您会发现 parseLong 将 return long 并且它需要转换为 integer 如果你需要它作为 integer.

public static long parseLong(CharSequence s, int beginIndex, int endIndex, int radix)

(Integer)(int) 或通常 (T) 用于转换为所需的 class 类型。

Long.parseLong("11101101111110100111001110011010",2) = 3992613786

上一行采用字符串形式的二进制,并将二进制计算为一个 10 基数,然后将其赋值给一个 long 变量。

下面一行

(int)Long.parseLong("11101101111110100111001110011010",2)

只是将 long 变量中存在的赋值转换为 int 值。

请记住,这不是一个安全的操作,因为 long 变量由 8 个字节 的信息组成,并且能够在(-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807)

的范围

另一方面,int 变量由 4 个字节 的信息组成,能够容纳 (-2,147,483,648 to 2,147,483,647)[=21 范围内的数字=]

您可以使用以下内容来理解为什么这不安全

    long a = Long.MAX_VALUE;
    System.out.println(a); // Prints 9223372036854775807
    int b = (int) a;
    System.out.println(b);  // Prints -1

最大的正 long 值当转换为 int 变量时,它变成负值 -1

最后,我用了gengkevhere的答案。

By playing around, I found something similar to BreizhGatch's function, but that doesn't require a conditional statement. n & 0x80000000 extracts the 32-bit sign bit; then, the - keeps the same 32-bit representation but sign-extends it; finally, the extended sign bits are set on n.

def toSigned32(n):

n = n & 0xffffffff return n | (-(n & 0x80000000))