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) }

golang程序打包(int8数据类型看数据存储规则)(1)

编译器报错: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......依次类推。

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

,