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

时间:2015-09-29 15:50:47

标签: java swift

我尝试将此代码用Java转换为swift 2.0

long checksumValue = 4253726258L;
int liCrc32 = (int)checksumValue;
System.out.println("liCrc32" + liCrc32)

LiCrc32等于-41241038

我的快速版

let int64: Int64 = 4253726258
let a:Int = Int(int64)

a给我回复4253726258

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

3 个答案:

答案 0 :(得分:5)

来自Swift documentation

  

<强> Int

     

在大多数情况下,您无需选择特定大小的整数   在你的代码中使用。 Swift提供了一个额外的整数类型Int,   其大小与当前平台的原生单词大小相同:

     
      
  • 在32位平台上,Int的大小与Int32相同。

  •   
  • 在64位平台上,Int的大小与Int64相同。

  •   
     

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

Java's int, on the other hand, is always 4 bytes.

  

整数类型为byteshort int long,其值为   8位,16位, 32位和64位带符号二进制补码整数,   [...]

long投射到int会导致narrowing primitive conversion

  

缩小的原始转换可能会丢失有关的信息   数值的整体幅度,也可能失去精度   范围。

答案 1 :(得分:4)

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

println(sizeof(Int)) // Should print 8 on your platform

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

let int64: Int64 = 4253726258
let a:Int32 = Int32(int64)

可能会因Swift实施中的错误而导致问题。

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

let int64: Int64 = 4253726258
let a:Int = Int((int64 << 32) >> 32)
println(a) // prints -41241038

Demo.

答案 2 :(得分:2)

  

int:默认情况下,int数据类型是32位带符号的二进制补码整数,其最小值为-231且最大值为   值231-1。在Java SE 8及更高版本中,您可以使用int数据类型   表示无符号的32位整数,其最小值为   0和最大值232-1。使用Integer类来使用int数据   键入无符号整数。请参阅“数字类”一节   更多信息。静态方法,如compareUnsigned,divideUnsigned   等已添加到Integer类以支持算术   无符号整数的运算。

     

long:长数据类型是64位二进制补码整数。带符号的long的最小值为-263,最大值为263-1。   在Java SE 8及更高版本中,您可以使用长数据类型来表示   无符号64位长,最小值为0,最大值为0   值为264-1。需要一系列值时,请使用此数据类型   比int提供的更广泛。 Long类还包含方法   比如compareUnsigned,divideUnsigned等支持算术   无符号长的操作。

意味着Java中的int&lt; J8可以是最大的:

2.147.483.647

小于你的int:  4.253.726.258

因此它不适合您的int,您需要坚持long或将Java更新为版本8并制作无符号的int。

转换后的情况是,在2.147.483.647之后,计数从最小数字(-2.147.483.647)开始,最后为您提供-41241038 -2.147.483.647+ (4.253.726.258 - 2.147.483.647)