我尝试编写一个逻辑,即将int32
正值转换为相应的负值,即abs(negativeInt32) == positiveInt32
。
我已经尝试过两种方法:
-
第一:
fmt.Printf("%vn", int32(^uint32(int32(2) -1)))
这会导致错误:
prog.go:8: constant 4294967294 overflows int32
-
第二:
var b int32 = 2 fmt.Printf("%vn", int32(^uint32(int32(b)-1)))
这会导致
-2
.
两者怎么会导致不同的结果。我认为他们是平等的。
play.golang.org
编辑
编辑以将uint32
替换为第一种情况的int32
。
回答
对于那些提出这个问题的人,我自己已经回答了这个问题。 :)
这两个结果是不同的,因为第一个值被类型转换为无符号的 int32(一个uint32
)。
这发生在这里:uint32(^uint32(int32(2) -1))
或者更简单地说:uint32(-2)
int32
可以存储 -2147483648 和 2147483647 之间的任何整数。
总共有4294967296个不同的整数值(2^32...,即32位)。
无符号 int32 可以存储相同数量的不同整数值,但会丢弃标牌 (+/-)。换句话说,无符号 int32 可以存储从 0 到 4294967295 的任何值。
但是,当我们将有符号的 int32(值为 -2)类型转换为无符号的 int32 时会发生什么,它不可能存储 -2 的值?
正如您所发现的,我们得到了4294967294的价值。在数字系统中,一个小于 0 的整数是4294967295;4294967294恰好是 0 - 2 的总和。
你好 你可以简单地尝试下面的代码
var z int32 =5
a:=-(z)
偶尔,我了解到为什么我们不能做
fmt.Printf("%vn", int32(^uint32(int32(2) -1)))
在编译时。而是^uint32(int32(2)-1)
被视为具有uint32
类型的constant
值。它的价值是4294967294
。这超过了 2147483647
的最大值 int32
。因此,当您在源代码文件上运行go build
时。 显示Compile error
。
对此的正确答案应该是:
fmt.Printf("%vn, ^(int32(2) - 1))
即,我们应该首先在int32
类型中获取相应的 1
值,然后将其转换为 two's complementary form
的值 -1
。
但是,根据这个golang博客的An exercise: The largest unsigned int
部分,这在运行时是合法的。所以代码
var b int32 = 2
fmt.Printf("%vn", int32(^uint32(int32(b)-1)))
没事。
最后,这与 Golang 中的常量有关。 :)