Go 是一种新的语言, 一种并发的带垃圾回收的快速编译的语言 Go 是谷歌 2009 年发布的第二款编程语言 2009 年 7 月份, 谷歌曾发布了 Simple 语言, 它是用来开发 Android 应用的一种 BASIC 语言
int 和 uint 类型在我们日常开发中经常会用到, 但有个疑问就是这两个类型有多大, 通过各种尝试最终得到了答案, 所以下面这篇文章主要给大家介绍了关于 Golang 中的 int 类型和 uint 类型到底有多大的相关资料, 文中通过示例代码介绍的非常详细, 需要的朋友可以参考下
在开始之前, 我们先来看看 uint 与 int 的区别
上面是图, 下面是源码:
- package main
- import (
- "fmt"
- _ "time"
- )
- func main() {
- a := byte(255) //11111111 这是 byte 的极限, 因为 a := byte(256)// 越界报错, 0~255 正好 256 个数, 不能再高了
- b := uint8(255) //11111111 这是 uint8 的极限, 因为 c := uint8(256)// 越界报错, 0~255 正好 256 个数, 不能再高了
- c := int8(127) //01111111 这是 int8 的极限, 因为 b := int8(128)// 越界报错, 0~127 正好 128 个数, 所以 int8 的极限只是 256 的一半
- d := int8(a) //11111111 打印出来则是 - 0000001,int8(128)int8(255)int8(byte(255))都报错越界, 因为 int 极限是 127, 但是却可以写: int8(a), 第一位拿来当符号了
- e := int8(c) //01111111 打印出来还是 01111111
- fmt.Printf("%08b %d \n", a, a)
- fmt.Printf("%08b %d \n", b, b)
- fmt.Printf("%08b %d \n", c, c)
- fmt.Printf("%08b %d \n", d, d)
- fmt.Printf("%08b %d \n", e, e)
- }
引言
今天调试一个问题, 发现一个我无法理解的情况:
- package main
- import (
- "fmt"
- "math"
- "runtime"
- )
- func main() {
- var a uint = math.MaxUint64
- fmt.Println("Hello, playground", a, runtime.Version())
- }
把 64 位的数字赋值给 uint, 我理解 uint 是 32 位的, 为啥可以编译通过? 但是我接着又在 playground 上试了一把, 结果是编译不过了:
constant 18446744073709551615 overflows uint
int 和 uint 到底占多大空间?
其实我一直理解是 32 位的因为别的语言是这样, 惯性思维了
直接看一下官方文档:
int is a signed integer type that is at least 32 bits in size. It is a distinct type, however, and not an alias for, say, int32.
uint 和 int 情况差不多翻译一下, 就是说这个整形最少占 32 位, int 和 int32 是两码事
再看一下 davecheney 大神的回复(大神半夜回复 GitHub 真是敬业啊):
uint is a variable sized type, on your 64 bit computer uint is 64 bits wide.
我的理解 uint 类型长度取决于 CPU, 如果是 32 位 CPU 就是 4 个字节, 如果是 64 位就是 8 个字节我的电脑是 64 位的, 而 playground 是 32 位的, 问题就出在这里
More
这里就会出现一个情况, int 和 uint 是根据 CPU 变化的, 如何知道当前系统的情况?
CPU 型号: runtime.GOARCH
int 的长度: strconv.IntSize
写了这么多年 Golang,int 天天用, 一直被我当 32 位处理, 说来惭愧
来源: http://www.phperz.com/article/18/0321/362576.html