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