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 的总和。
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 中的常量有关。:)
- 2 回答
- 0 关注
- 458 浏览
添加回答
举报