在计算机中最小的信息单位是bit,也就是一个二进制位,8个bit组成一个Byte,也就是字节。一个存储单元(一个地址),可以存储一个字节,也就是8个二进制位。计算机的存储器容量是以字节为最小单位来计算的,对于一个有128个存储单元的存储器,可以说它的容量为128字节。
地址总线,是用来传输数据所在地址的,而32位系统一般有32根地址总线,那么所能传输的最大数据地址就是2^32,这里所指的地址是真实的数据地址,即物理地址。用户在使用计算机时能够访问的最大内存不单是由CPU地址总线的位数决定的,还需要考虑操作系统的实现。实际上用户在使用计算机时,进程访问到的地址都是逻辑地址,并不是真实的物理地址,逻辑地址是由操作系统提供的,并维护了逻辑地址和物理地址的映射。对于32位的windows操作系统,提供的逻辑地址寻址范围是4G,但是对于这4G的逻辑地址,又要划分出来一份给CPU寄存器、ROM的这些物理地址进行映射,那么剩下和内存条的物理地址进行映射的空间肯定没有4G了,而[64位操作系统的寻址能力就是2的64次方,也就是17179869184G,当然这只是理论值,实际中不可能用到这么大的内存,目前64位windows系统最大只支持128G。而当前主流主板只能加到16G
int和uint 是多少位,取决于运行环境版本位数
64位golang运行环境,1个int是64位,占8字节。 8G内存能存储 大约13亿个int整数
unsafe包Sizeof返回类型v本身数据所占用的字节数。返回值是“顶层”的数据占有的字节数。例如,若v是一个切片,它会返回该切片描述符的大小,而非该切片底层引用的内存的大小。
1个字节型byte占 1字节
1个字符类型rune 4个字节 (等价于int32 )
1个汉字 3个字节
(var str byte = '中') overflows byte 汉字占3个字节
(str := '中' 自动推到类型为int32 4字节)
golang中string底层是通过byte数组实现的。中文字符在unicode下占2个字节,在utf-8编码下占3个字节,而golang默认编码正好是utf-8。所以golang中1个汉字3字节 。
golang中还有一个byte数据类型与rune相似,它们都是用来表示字符类型的变量类型。它们的不同在于:
byte 等同于int8,常用来处理ascii字符
rune 等同于int32,常用来处理unicode或utf-8字符
"hello 你好"
fmt.Println("len(str):", len(str))
运行结果:12 (1个汉字3个byte字节)
//golang中的unicode/utf8包提供了用utf-8获取长度的方法
//函数类似RuneCount但输入参数是一个字符串。
fmt.Println("RuneCountInString:", utf8.RuneCountInString(str))
运行结果:8 (一个rune等于int32 4字节,能存储1个汉字)
//通过rune类型处理unicode字符
fmt.Println("rune:", len([]rune(str)))
运行结果:8 (一个rune等于int32 4字节,能存储1个汉字)
有疑问加站长微信联系(非本文作者)