【避坑指南】golang中使用int类型导致数据溢出

首先明确几个关键概念

  • windows 或 linux 系统分为32位 和 64位

  • go build 可以对应编译32位和64位的可执行程序产物

  • golang中的int类型,在32位系统,最大值可以到21亿,在64位系统,最大值可以是2的63次方

image.png

好的,概念了解清楚了,我们说一下坑:

如果你用一个int型的变量存储一个大于21亿(大约)的数字,那么在不同的编译环境下,结论就是不同的了。

var num int
num = 2147483647
fmt.Println(num, num+1)

//32位系统
输出结果:2147483647 -2147483648

//64位系统
输出结果:2147483647 2147483648

总结一下:

如果你的变量类型为int,用在统计结果中,在32位环境下,变量值超过21亿(大约)出现负值。所以明确数据类型可以有效避免不确定因素导致的坑

命令集合

//查看系统位数
uname -a

//查看golang可执行程序位数,主要看GOARCH参数
go env  | grep GOARCH 

扩展知识 (摘自https://jingyan.baidu.com/article/64d05a02143ea1de55f73b86.html)

了解"64"这个字眼的含义?
指出CPU, 系统, 包等是64位。AMD64又称"x86_64"或"x64"。x86_64就是64位的系统, 这里的x代表不确定, 可以是3、4、5、6, 分别对应386, 486, 586, 686, 也就是说x86_64是个统称, 如果是i686_64也是属于x86_64这个统称的。

了解"32"这个字眼的含义?
指出CPU, 系统, 包等是32位。 一般写x86的就是32位。这里的x代表不确定, 可以是3、4、5、6, 分别对应386, 486, 586, 686, 也就是说x86是个统称。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容