[Day 15] -『 GO语言学习笔记』- 核心型别(II)

以下笔记摘录自『 The Go Workshop 』。

溢位和越界绕回

如果尝试在建立变数时,赋予一个超过型别容许上限的初始值,就会发生溢位(overflow)错误。以int8为例,他能容许的最大值是127。

For example,

package main

import "fmt"

func main() {
	var a int8 = 128
	fmt.Println(a)
}
///
Output
constant 128 overflows int8

这个问题不难修正,但真正的问题是若在建立变数後,才将他的值设超过127,这时会发生越界绕回(wraparound)现象,也就是超过最大值後重新从最小值计算。

很容易碰上越界绕回这个陷阱,因为编辑器也没办法拦截。

package main

import "fmt"

func main() {
	var a int8 = 125
	var b uint8 = 253
	for i := 0; i < 5; i++ {
		a++
		b++
		fmt.Println(i, ")", "int8", a, "uint8", b)
	}
}
// Output
0 ) int8 126 uint8 254
1 ) int8 127 uint8 255
2 ) int8 -128 uint8 0
3 ) int8 -127 uint8 1
4 ) int8 -126 uint8 2

大数值

如果需要的数值超过(低於)int64与uint64,可以向套件math/big求助。

package main

import (
	"fmt"
	"math"
	"math/big"
)

func main() {
	intA := math.MaxInt64
	intA = intA + 1

	bigA := big.NewInt(math.MaxInt64)
	bigA.Add(bigA, big.NewInt(1))

	fmt.Println("MaxInt64: ", math.MaxInt64)
	fmt.Println("Int     :", intA)
	fmt.Println("Big Int : ", bigA.String())
}
// Output
MaxInt64:  9223372036854775807 <--- int64 最大值
Int     : -9223372036854775808 <--- int 发生越界绕回
Big Int :  9223372036854775808 <--- big int 正确 +1

位元(Byte)

在Go语言里面,byte型别其实就是unit8型别的别名,後者是以8个位元储存的正整数。
每一个位元(bit)代表一个二进位值,意即开或关(1或0)。8个位元总共有256种可能的『开关』组合,而既然unit8的值是由0到255,那就可以用0到255的整数来代表256种状态。


<<:  30天学会 Python: Day 13-站在巨人的肩上

>>:  Day16:请说出暗号证明你的身份

Day 21 - WooCommerce: 信用卡付款设定选项 (上)

图 21-1: 付款方式列表 我们已经建立了继承 WC_Payment_Gateway 的的 WC...

[Day24] 在 Codecademy 学 React ~ 终於来到 Hook 的世界 ‧ useState 篇 (1)

前言 看到今天标题 useState, 你可能会说我前面不是讲过了吗XD 其实之前那样算是直接跳过第...

拆掉 v-model + computed get/set 到 vuex

为什麽要特别写 Form 表单攻略呢? 因为这是使用者可以输入资料的常见途径,一种可以「写入」资料的...

Day 0xF UVa10071 Back to High School Physics

Virtual Judge ZeroJudge 题意 输入粒子经过 t 秒後的速度为 v,求 2t...

Day 8 - 原型 (7): 完成

前言 今天完成原型剩下的工作吧。 帖子修正 回覆帖子 流程就是输入要显示的名字及回覆内容, 最後到点...