iOS16.7/macOS13.6中UInt64.max格式化结果错误问题问询
UInt64/UInt最大值格式化的系统版本差异问题解答
问题现象
- iOS 16.7、macOS 13.6环境下:
UInt64.max.formatted(.number)与UInt.max.formatted(.number)返回错误结果:实际输出9,223,372,036,854,775,807(即263-1),而非预期的`18,446,744,073,709,551,615`(264-1)- 使用
NumberFormatter#string(from:)处理该最大值时,返回结果为-1
- iOS 17.0.1、macOS 14.0环境下:
- 两种格式化方式均返回正确结果:
.formatted(.number)输出带千分位的正确最大值,NumberFormatter输出纯数字格式的正确最大值18446744073709551615
- 两种格式化方式均返回正确结果:
结论
这是iOS 16、macOS 13中Foundation.framework的Bug,并非你的代码存在问题。
问题根源
旧版本Foundation的格式化逻辑对无符号64位整数的处理存在符号溢出错误:将UInt64.max(无符号64位最大值)错误识别为有符号64位整数的最小值(对应十进制-1),后续格式化流程又错误转换为有符号64位整数的最大值9,223,372,036,854,775,807。虽然iOS 17官方发布说明未提及该修复,但新版本的正确行为已确认苹果修复了此底层逻辑漏洞。
内容的提问来源于stack exchange,提问作者mtgto
相关产品推荐
相关产品推荐

