为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕容3067478 2021-12-07 15:40:14
我尝试编写一种逻辑是将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编辑编辑替换uint32用int32的第一种情况。回答对于那些遇到这个问题的人,我自己已经回答了这个问题。:)
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

这两个结果是不同的,因为第一个值被类型转换为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 的总和。


查看完整回答
反对 回复 2021-12-07
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

偶尔,我了解到为什么我们不能做


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 = 2

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

没关系。


而且,最后说到这和 Golang 中的常量有关。:)


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 458 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信