如何将正有符号 int32 值转换为负值

  • 本文关键字:转换 int32 符号 go
  • 更新时间 :
  • 英文 :


我尝试编写一个逻辑,即将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 中的常量有关。 :)