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……依次类推。
有疑问的同学,可以试一下