猿问

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

我尝试编写一种逻辑是将int32正值转换为相应的负值,即abs(negativeInt32) == positiveInt32.

我已经尝试过:

  • 第一的:

    fmt.Printf("%v\n", int32(^uint32(int32(2) -1)))

    这会导致错误: prog.go:8: constant 4294967294 overflows int32

  • 第二:

    var b int32 = 2
    fmt.Printf("%v\n", int32(^uint32(int32(b)-1)))

    这导致-2.

两者如何导致不同的结果。我认为他们是平等的。
play.golang.org

编辑

编辑替换uint32int32的第一种情况。

回答

对于那些遇到这个问题的人,我自己已经回答了这个问题。:)


慕容3067478
浏览 459回答 2
2回答

泛舟湖上清波郎朗

这两个结果是不同的,因为第一个值被类型转换为unsigned int32 (a uint32)。这发生在这里:uint32(^uint32(int32(2) -1))或更简单地说:uint32(-2)Anint32可以存储 -2147483648 和 2147483647 之间的任何整数。总共有 4294967296 个不同的整数值(2^32...即 32 位)。一个无符号INT32可以存储相同量不同的整数值,但是丢弃该标志(+/-)。换句话说,无符号int32 可以存储从 0 到 4294967295 的任何值。但是,当我们一个类型转换会发生什么签订INT32(与值-2),以一个无符号INT32,它不可能存储-2价值?正如你所发现的,我们得到了 4294967294 的值。在一个小于 0 的整数是 4294967295 的数字系统中;4294967294 恰好是 0 - 2 的总和。

慕妹3146593

偶尔,我了解到为什么我们不能做fmt.Printf("%v\n", int32(^uint32(int32(2) -1)))在编译时。它被^uint32(int32(2)-1)视为constant具有uint32类型的值。它的价值是4294967294。这超过了int32for的最大值2147483647。所以当你go build在源代码文件上运行时。Compile error显示。这个问题的正确答案应该是:fmt.Printf("%v\n, ^(int32(2) - 1))即,我们应该先得到1in int32type的对应值,然后将其转换为two's complementary formas 的值-1。但是,根据这个 golang blog的An exercise: The largest unsigned int部分,这在运行时是合法的。所以代码var b int32 = 2fmt.Printf("%v\n", int32(^uint32(int32(b)-1)))没关系。而且,最后说到这和 Golang 中的常量有关。:)
随时随地看视频慕课网APP

相关分类

Go
我要回答