Go数据类型
支持更新…
1 go语言中的数据类型
(1)float32类型底层原理
浮点数:小数点可以浮动的数,称为浮点数。与浮点数对应的还有定点数,也就是小数点不能浮动的数。
举例:以100.23为例,如果存储成定点小数,此时如果小数点位置放错了,成了这样:1.0023,则最后的结果肯定错了。如果是浮点数,则小数点可以随意移动,可以表示成科学计数法的形式:1.0023*102,在计算中,数字都是2的正数幂表示,所以计算机中的表示方法一般都是某个小数乘以2k。
float32如何如何将一个小数转成二进制数:
- 整数部分:就和普通十进制数转成二进制数一样
- 小数部分:让小数部分乘以2,如果得到的结果小于1,则继续乘以2,如果结果大于1,则将结果减去1再继续乘以2,直到结果刚好等于1为止,然后去每次乘积结果的整数部分的值为最终的二进制表示
小数转成二进制数示例:
float32的底层存储将一个小数分成符号部分+指数部分+尾数部分存储:
其中
- sign表示符号位,1表示负数,0表示正数
- exponent表示指数位,指定了⼩数点在数据中的位置,指数可以是负数,也可以是正数,指数位的⻓度越⻓则数值 的表达范围就越⼤;
- fraction表示尾数位,⼩数点右侧的数字,也就是⼩数部分,⽐如⼆进制 1.0011 x 2^(-2),尾数部分就是 0011, ⽽且尾数的⻓度决定了这个数的精度,因此如果要表示精度更⾼的⼩数,则就要提⾼尾数位的⻓度;
float64的底层存储如下:
- 符号位:1位
- 指数位:11位
- 尾数位:52位
(2)string类型
go
语言中,采用UTF8
编码技术、Unicode
编码。
UTF8是一种编码技术,除了UTF8之外、还有UTF16(使用2个字节或4个字节表示每个Unicode字符码点)、UTF32(4个字节表示每个Unicode字符码点)等。
相对于UTF-16和UTF-32方案,UTF-8方案的空间利用率也是最高的。并且,utf8解码和编码时,也无需考虑字节序问题。
以字符“中”为例,它的码点(序号)为U+4E2D,它在Utf8编码则为“0xE4 0xB8 0xAD”,即在内存中Go实际用三个字节来表示“中”这个Unicode字符。
问:UTF8编码使用几个字节存储Unicode编码呢?
答:
- 前128个与ASCII字符重合的码点(U+0000~U+007F)使用1个字节表示;
- 带变音符号的拉丁文、希腊文、西里尔字母、阿拉伯文等使用2个字节来表示;
- 而东亚文字(包括汉字)使用3个字节表示;
- 其他极少使用的语言的字符则使用4个字节表示
(3)字符串和各种int类型之间的相互转换方式
-
string转成int
int, err := strconv.Atoi(string)
-
string转成int64
int64, err := strconv.ParseInt(string, 10, 64)
-
string转成uint64
uint64, err := strconv.ParseUint(string, 10, 64)
-
int转成string
string := strconv.Itoa(int)
-
int64转成string
string := strconv.FormatInt(int64, 10)
-
uint64转成string(10进制)
string := strconv.FormatUint(uint64, 10)
-
uint64转成string(16进制)
string := strconv.FormatUint(uint64, 16)
(4)FAQ
var a = 100
问:上面代码中,变量
a
属于什么数据类型?是int
、int8
、int16
、int32
还是int64
?答:变量
a
默认是int
数据类型。
问:如何查看变量作占用的字节数?
答:
import "unsafe" func main () { bytesOfVariable := unsafe.Sizeof(variable) }
var a = 1.1
问:上面的代码中,变量
a
是什么数据类型?答:go语言中,上面的代码,变量
a
默认是float64
数据类型的