我尝试将此代码用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中价值是负面的?
答案 0 :(得分:5)
<强>
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.
整数类型为
byte
,short
,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
答案 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)