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

为什么不用 uint32 而不是 int64?

为什么不用 uint32 而不是 int64?

Go
慕容森 2022-06-01 11:01:42
go界面中也有一些类似的设计。例如,读写的结果只能是 values >= 0。为什么不只使用unsigned int类型?使用有符号类型的目的是什么?// The Copy function uses ReaderFrom if available.type ReaderFrom interface {    ReadFrom(r Reader) (n int64, err error)}// The Copy function uses WriterTo if available.type WriterTo interface {    WriteTo(w Writer) (n int64, err error)}
查看完整描述

1 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

我在Go Programming Language (A. Donovan, B. Kernighan)一书中找到了一个很好的解释:


尽管 Go 提供了无符号数和算术,但我们倾向于使用有符号int形式,即使对于不能为负数的量,例如数组的长度,尽管uint这似乎是一个更明显的选择。事实上,内置len函数会返回一个 signed int,就像在这个循环中以相反的顺序宣布奖牌一样:


medals := []string{"gold", "silver", "bronze"}

    for i := len(medals) - 1; i >= 0; i-- {

    fmt.Println(medals[i]) // "bronze", "silver", "gold"

}

另一种选择将是灾难性的。如果len返回一个无符号数,那么i也将是 a uint,并且根据定义,条件i >= 0 将始终为真。在第三次迭代(其中)之后i == 0,该i--语句将导致i变为不是-1,而是最大值uint,并且medals[i]通过尝试访问切片边界之外的元素,计算会在运行时失败或恐慌。出于这个原因,无符号数倾向于仅在需要其位运算符或特殊算术运算符时使用,例如在实现位集、解析二进制文件时。


查看完整回答
反对 回复 2022-06-01
  • 1 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号