golang的int8数据类型:

int8: -128 ~ 127

这是个典型的1字节数据类型,带符号,有别于byte:0-255

因为golang是强制数据类型,并且不能自动转换。我们来测试下面这样的代码:

 package main

import (
"fmt"
)

func main() {
var a int8 = 127
var b int8
b = a + 1
fmt.Printf("b=%v", b)
}
  

输出:b=-128

再来测试:

 package main

import (
"fmt"
)

func main() {
var a int8 = 127
var b int8
b = a + 6
fmt.Printf("b=%v", b)
}  

输出:b=-123

看完以上代码,大家应该能明白int8的数据存储规则:

上表第1列表示int8数据存储的数值,第2列表示实际的数值。

两者是一个非常简单的线性对应关系。比如127+6=133,转换成int8就是-123

验证一下:

 package main

import (
"fmt"
)

func main() {
var a int8 = 127
var b int8
b = a + 127
fmt.Printf("b=%v", b)
}  

结果是b=-2

和上表完全一致。猜测正确。

问题:如果这样写,会有什么结果?

 func main() {
var a int8 = 127
var b int8
b = a + 127
fmt.Printf("b=%v", b)
}  

编译器报错:constant 128 overflows int8

常量128已经超出int8的最大值127了[捂脸]

看完这个小例子,应该可以明白带符号int8实际存储的数据格式了吧。

电脑只处理字节整数,并不理解符号。为了方便处理带符号的int8

结论就是: 0~127单字节存储数据,对应int8的0~127值 128~255单字节存储数据,对应int8的-128~-1值 线性转换规则就是n-256

这个规则应该通用于c系语言或者受c影响的其他高级语言。

同样的道理:int16.转换规则应该是n-65536……依次类推。

有疑问的同学,可以试一下