This commit is contained in:
Akagi201 2016-04-26 01:25:07 +08:00
parent 53b3c683b8
commit f531eba5b2

View File

@ -1,8 +1,8 @@
## 3.1. 整型 ## 3.1. 整型
Go语言的数值类型包括几种不同大小的整数、浮点数和复数。每种数值类型都决定了对应的大小范围和是否支持正负符号。让我们先从整数类型开始介绍。 Go语言的数值类型包括几种不同大小的整数、浮点数和复数。每种数值类型都决定了对应的大小范围和是否支持正负符号。让我们先从整数类型开始介绍。
Go语言同时提供了有符号和无符号类型的整数运算。这里有int8、int16、int32和int64四种截然不同大小的有符号整数类型分别对应8、16、32、64bit大小的有符号整与此对应的是uint8、uint16、uint32和uint64四种无符号整数类型。 Go语言同时提供了有符号和无符号类型的整数运算。这里有int8、int16、int32和int64四种截然不同大小的有符号整数类型分别对应8、16、32、64bit大小的有符号整数与此对应的是uint8、uint16、uint32和uint64四种无符号整数类型。
这里还有两种一般对应特定CPU平台机器字大小的有符号和无符号整数int和uint其中int是应用最广泛的数值类型。这两种类型都有同样的大小32或64bit但是我们不能对此做任何的假设因为不同的编译器即使在相同的硬件平台上可能产生不同的大小。 这里还有两种一般对应特定CPU平台机器字大小的有符号和无符号整数int和uint其中int是应用最广泛的数值类型。这两种类型都有同样的大小32或64bit但是我们不能对此做任何的假设因为不同的编译器即使在相同的硬件平台上可能产生不同的大小。
@ -12,7 +12,7 @@ Unicode字符rune类型是和int32等价的类型通常用于表示一个Unic
不管它们的具体大小int、uint和uintptr是不同类型的兄弟类型。其中int和int32也是不同的类型即使int的大小也是32bit在需要将int当作int32类型的地方需要一个显式的类型转换操作反之亦然。 不管它们的具体大小int、uint和uintptr是不同类型的兄弟类型。其中int和int32也是不同的类型即使int的大小也是32bit在需要将int当作int32类型的地方需要一个显式的类型转换操作反之亦然。
其中有符号整数采用2的补码形式表示也就是最高bit位用表示符号位一个n-bit的有符号数的值域是从$$-2^{n-1}$$到$$2^{n-1}-1$$。无符号整数的所有bit位都用于表示非负数值域是0到$$2^n-1$$。例如int8类型整数的值域是从-128到127而uint8类型整数的值域是从0到255。 其中有符号整数采用2的补码形式表示也就是最高bit位用表示符号位一个n-bit的有符号数的值域是从$$-2^{n-1}$$到$$2^{n-1}-1$$。无符号整数的所有bit位都用于表示非负数值域是0到$$2^n-1$$。例如int8类型整数的值域是从-128到127而uint8类型整数的值域是从0到255。
下面是Go语言中关于算术运算、逻辑运算和比较运算的二元运算符它们按照先级递减的顺序的排列 下面是Go语言中关于算术运算、逻辑运算和比较运算的二元运算符它们按照先级递减的顺序的排列
@ -28,7 +28,7 @@ Unicode字符rune类型是和int32等价的类型通常用于表示一个Unic
对于上表中前两行的运算符,例如+运算符还有一个与赋值相结合的对应运算符+=,可以用于简化赋值语句。 对于上表中前两行的运算符,例如+运算符还有一个与赋值相结合的对应运算符+=,可以用于简化赋值语句。
算术运算符+、-、`*`和`/`可以适用于整数、浮点数和复数,但是取模运算符%仅用于整数间的运算。对于不同编程语言,%取模运算的行为可能并不相同。在Go语言中%取模运算符的符号和被取模数的符号总是一致的,因此`-5%3`和`-5%-3`结果都是-2。除法运算符`/`的行为则依赖于操作数是否为全为整数,比如`5.0/4.0`的结果是1.25但是5/4的结果是1因为整数除法会向着0方向截断余数。 算术运算符`+``-`、`*`和`/`可以适用于整数、浮点数和复数,但是取模运算符%仅用于整数间的运算。对于不同编程语言,%取模运算的行为可能并不相同。在Go语言中%取模运算符的符号和被取模数的符号总是一致的,因此`-5%3`和`-5%-3`结果都是-2。除法运算符`/`的行为则依赖于操作数是否为全为整数,比如`5.0/4.0`的结果是1.25但是5/4的结果是1因为整数除法会向着0方向截断余数。
如果一个算术运算的结果不管是有符号或者是无符号的如果需要更多的bit位才能正确表示的话就说明计算结果是溢出了。超出的高位的bit位部分将被丢弃。如果原始的数值是有符号类型而且最左边的bit为是1的话那么最终结果可能是负的例如int8的例子 如果一个算术运算的结果不管是有符号或者是无符号的如果需要更多的bit位才能正确表示的话就说明计算结果是溢出了。超出的高位的bit位部分将被丢弃。如果原始的数值是有符号类型而且最左边的bit为是1的话那么最终结果可能是负的例如int8的例子
@ -43,12 +43,12 @@ fmt.Println(i, i+1, i*i) // "127 -128 1"
两个相同的整数类型可以使用下面的二元比较运算符进行比较;比较表达式的结果是布尔类型。 两个相同的整数类型可以使用下面的二元比较运算符进行比较;比较表达式的结果是布尔类型。
``` ```
== equal to == 等于
!= not equal to != 不等于
< less than < 小于
<= less than or equal to <= 小于等于
> greater than > 大于
>= greater than or equal to >= 大于等于
``` ```
事实上,布尔型、数字类型和字符串等基本类型都是可比较的,也就是说两个相同类型的值可以用==和!=进行比较。此外,整数、浮点数和字符串可以根据比较结果排序。许多其它类型的值可能是不可比较的,因此也就可能是不可排序的。对于我们遇到的每种类型,我们需要保证规则的一致性。 事实上,布尔型、数字类型和字符串等基本类型都是可比较的,也就是说两个相同类型的值可以用==和!=进行比较。此外,整数、浮点数和字符串可以根据比较结果排序。许多其它类型的值可能是不可比较的,因此也就可能是不可排序的。对于我们遇到的每种类型,我们需要保证规则的一致性。
@ -73,7 +73,7 @@ Go语言还提供了以下的bit位操作运算符前面4个操作运算符
>> 右移 >> 右移
``` ```
位操作运算符`^`作为二元运算符时是按位异或XOR当用作一元运算符时表示按位取反也就是说它返回一个每个bit位都取反的数。位操作运算符`&^`用于按位置零AND NOT表达式`z = x &^ y`结果z的bit位为0如果对应y中bit位为1的话否则对应的bit位等于x相应的bit位的值。 位操作运算符`^`作为二元运算符时是按位异或XOR当用作一元运算符时表示按位取反也就是说它返回一个每个bit位都取反的数。位操作运算符`&^`用于按位置零AND NOT如果对应y中bit位为1的话, 表达式`z = x &^ y`结果z的对应的bit位为0否则z对应的bit位等于x相应的bit位的值。
下面的代码演示了如何使用位操作解释uint8类型值的8个独立的bit位。它使用了Printf函数的%b参数打印二进制格式的数字其中%08b中08表示打印至少8个字符宽度不足的前缀部分用0填充。 下面的代码演示了如何使用位操作解释uint8类型值的8个独立的bit位。它使用了Printf函数的%b参数打印二进制格式的数字其中%08b中08表示打印至少8个字符宽度不足的前缀部分用0填充。
@ -140,7 +140,7 @@ invalid operation: apples + oranges (mismatched types int32 and int16)
var compote = int(apples) + int(oranges) var compote = int(apples) + int(oranges)
``` ```
如2.5节所述对于每种类型T如果转换允许的话类型转换操作T(x)将x转换为T类型。许多整数之间的相互转换并不会改变数值;它们只是告诉编译器如何解释这个值。但是对于将一个大尺寸的整数类型转为一个小尺寸的整数类型,或者是将一个浮点数转为整数,可能会改变数值或丢失精度: 如2.5节所述对于每种类型T如果转换允许的话类型转换操作T(x)将x转换为T类型。许多整数之间的相互转换并不会改变数值它们只是告诉编译器如何解释这个值。但是对于将一个大尺寸的整数类型转为一个小尺寸的整数类型或者是将一个浮点数转为整数可能会改变数值或丢失精度
```Go ```Go
f := 3.141 // a float64 f := 3.141 // a float64