如何在Java和swift中将long转换为int?

Bol*_*olo 7 java swift

我试图将这个Java代码转换为swift 2.0

long checksumValue = 4253726258L;
int liCrc32 = (int)checksumValue;
System.out.println("liCrc32" + liCrc32)
Run Code Online (Sandbox Code Playgroud)

LiCrc32等于-41241038

我的版本很快

let int64: Int64 = 4253726258
let a:Int = Int(int64)
Run Code Online (Sandbox Code Playgroud)

a返回我4253726258

我不明白为什么在Java中价值是负面的?

Sot*_*lis 5

来自Swift文档

Int

在大多数情况下,您不需要选择要在代码中使用的特定大小的整数.Swift提供了一个额外的整数类型Int,它与当前平台的本机字大小相同:

  • 在32位平台上,Int大小与之相同Int32.

  • 在64位平台上,Int大小与之相同Int64.

除非您需要使用特定大小的整数,否则请始终Int在代码中使用 整数值.这有助于代码一致性和互操作性.即使在32位平台上,Int也可以存储-2,147,483,648和2,147,483,647之间的任何值,并且对于许多整数范围来说足够大.

int另一方面,Java 总是4个字节.

积分类型是byte,short,int,和long其值是8位,16位,32位分别和64位带符号的二进制补码整数,[...]

从a longinta的转换会导致缩小的原始转换

缩小的原始转换可能丢失关于数值的总量值的信息,并且还可能失去精度和范围.


das*_*ght 5

您使用了错误的类型:Swift的类型Int不一定与Java的类型匹配int,因为它的大小是特定于平台的。从您的输出来看,您的平台使用64位Int。确认方法如下:

println(sizeof(Int)) // Should print 8 on your platform
Run Code Online (Sandbox Code Playgroud)

Int32匹配Java的int。不幸的是,这种变化

let int64: Int64 = 4253726258
let a:Int32 = Int32(int64)
Run Code Online (Sandbox Code Playgroud)

可能由于Swift实施中的错误而导致问题。

如果需要对32位值进行符号扩展,则可以这样进行:

let int64: Int64 = 4253726258
let a:Int = Int((int64 << 32) >> 32)
println(a) // prints -41241038
Run Code Online (Sandbox Code Playgroud)

演示