go的int长度

参考自:https://blog.csdn.net/FromTheWind/article/details/105862844?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1.pc_relevant_default&utm_relevant_index=2

1,int长度

点击查看代码
package main

import (
	"fmt"
	"unsafe"
)

func main() {
	var i1 int = 1
	var i2 int8 = 2
	var i3 int16 = 3
	var i4 int32 = 4
	var i5 int64 = 5
	fmt.Println(unsafe.Sizeof(i1))
	fmt.Println(unsafe.Sizeof(i2))
	fmt.Println(unsafe.Sizeof(i3))
	fmt.Println(unsafe.Sizeof(i4))
	fmt.Println(unsafe.Sizeof(i5))
}

输出:

[root@localhost tmp]# go run test.go 
8
1
2
4
8
int类型的大小为 8 字节
int8类型大小为 1 字节
int16类型大小为 2 字节
int32类型大小为 4 字节
int64类型大小为 8 字节

通过上述可以看到,int和int64运行的结果一样。int64是有符号 64 位整型,而在64位操作系统中int的大小也是64位(8字节)。
直接看一下官方文档:
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.
翻译一下,就是说这个整形最少占32位,int和int32是两码事。
uint is a variable sized type, on your 64 bit computer uint is 64 bits wide.
uint和uint8等都属于无符号int类型
uint类型长度取决于 CPU,如果是32位CPU就是4个字节,如果是64位就是8个字节。

More
这里就会出现一个情况,int和uint是根据 CPU 变化的,如何知道当前系统的情况?

CPU 型号:runtime.GOARCH
int的长度:strconv.IntSize

总结
go语言中的int的大小是和操作系统位数相关的,如果是32位操作系统,int类型的大小就是4字节。如果是64位操作系统,int类型的大小就是8个字节。

版权声明:本文为CSDN博主「wolfengi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/FromTheWind/article/details/105862844

2,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)
}
posted @ 2022-02-28 11:49  ty1539  阅读(1272)  评论(0编辑  收藏  举报