登录
首页 >  Golang >  Go问答

将有符号整数转换为无符号整数的位运算

来源:stackoverflow

时间:2024-02-22 18:45:23 408浏览 收藏

一分耕耘,一分收获!既然都打开这篇《将有符号整数转换为无符号整数的位运算》,就坚持看下去,学下去吧!本文主要会给大家讲到等等知识点,如果大家对本文有好的建议或者看到有不足之处,非常欢迎大家积极提出!在后续文章我会继续更新Golang相关的内容,希望对大家都有所帮助!

问题内容

计算机使用二进制补码来存储整数。比如说,对于有符号的 int32,0xffffffff 代表“-1”。根据这个理论,用 c 语言编写这样的代码来将有符号整数初始化为 -1 并不难;

int a = 0xffffffff;
printf("%d\n", a);

显然,结果是-1

然而,在 go 中,相同的逻辑转储不同。

a := int(0xffffffff)
fmt.Printf("%d\n", c)

代码片段打印 4294967295,uint32 类型可以容纳的最大数字。即使我在 fmt.printf("%d\n", int(c)) 中显式转换 c,结果仍然是相同的。

当对有符号整数进行一些位运算时也会出现同样的问题,使有符号变成无符号。

那么,在这种情况下 go 会发生什么?


解决方案


这里的问题是 int 的大小不是固定的,它与平台相关。它可能是 32 位或 64 位。在后一种情况下,将 0xffffffff 分配给它相当于将 4294967295 分配给它,这就是您看到的打印内容。

现在,如果您将该值转换为 int32(32 位),您将得到 -1

a := int(0xffffffff)
fmt.printf("%d\n", a)

b := int32(a)
fmt.printf("%d\n", b)

这将输出(在 Go Playgroung 上尝试):

4294967295
-1

另请注意,在 go 中,无法将 0xffffffff 直接分配给 int32 类型的值,因为该值会溢出;创建具有非法值的类型常量也是无效的,例如 int32(0xffffffff)Spec: Constants:

所以这会产生编译时错误:

var c int32 = 0xffffffff // constant 4294967295 overflows int32

但你可以简单地这样做:

var c int32 = -1

你也可以这样做:

var c = ^int32(0) // -1

今天关于《将有符号整数转换为无符号整数的位运算》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>