为什么数组长度不可能为负数,还是采用有符号整型

用无符号整数,会出现计算下溢的情况,比如6-10就会得到2147483648*2-4的值,而不是-4,用有符号整数就不会有这个问题,而且用有符号整数在使用for循环的便利性上也比无符号整数要好

Why does len() returned a signed value?
Go的内置len()函数返回带符号的int。 为什么不使用uint代替?
len()是否有可能返回负数?
据我所知,答案是否定的:
数组:“元素的数量称为长度,从不为负。”
切片:“任何时候都保持以下关系:0 <= len(s) <= cap(s)”
地图"地图元素的数量称为其长度"。 (我在规范中找不到任何将其明确限制为非负值的内容,但我很难理解地图中的元素数可能少于0)
字符串"字符串值是一个(可能为空)字节序列。…可以使用内置函数len()来发现字符串s的长度(其大小以字节为单位)"(同样,很难理解如何 一个序列的字节数可以为负)
通道"在通道缓冲区(ditto)中排队的元素数

len()(和cap())返回int,因为这是用于索引切片和数组(不是uint)的索引。因此,问题更多是"为什么在没有负索引的情况下Go为什么使用有符号整数对切片/数组进行索引?"。
答案很简单:计算索引是很常见的,如果以无符号整数进行,则这种计算容易下溢。对于a和b的6和10的纯值,某些的纯正代码可能会生成i == 4294967291。这样的索引可能会使您的切片溢出。许多索引计算发生在0左右,并且使用无符号整数很难正确地进行计算,并且这些错误隐藏在数学上完全明智和合理的公式后面。这既不安全也不方便。
这是基于经验的权衡:使用无符号整数完成索引计算时,经常会发生下溢,而如果将有符号整数用于索引计算,则上溢的发生率将大大降低。
另外:在这种情况下,使用无符号整数基本上没有什么好处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值