七叶笔记 » golang编程 » 从Golang int8数据类型看数据存储规则

从Golang int8数据类型看数据存储规则

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的数据存储规则:

0

0

1

1

2

2

3

3

4

4

125

125

126

126

127

127

128

-128

127+1

129

-127

127+2

130

-126

127+3

131

-125

127+4

132

-124

127+5

133

-123

127+6

134

-122

127+7

135

-121

127+8

136

-120

127+9

137

-119

127+10

138

-118

127+11

139

-117

127+12

上表第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

235

-21

127+108

236

-20

127+109

237

-19

127+110

238

-18

127+111

239

-17

127+112

240

-16

127+113

241

-15

127+114

242

-14

127+115

243

-13

127+116

244

-12

127+117

245

-11

127+118

246

-10

127+119

247

-9

127+120

248

-8

127+121

249

-7

127+122

250

-6

127+123

251

-5

127+124

252

-4

127+125

253

-3

127+126

254

-2

127+127

255

-1

127+128

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

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

 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……依次类推。

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

相关文章