面试题答案
一键面试- 发生的情况:当将一个较大范围的整数类型(如
int64
)强制转换为较小范围的整数类型(如int8
),且原始值超出目标类型范围时,会发生截断,只保留目标类型能容纳的低字节数据。 - 代码示例:
package main
import (
"fmt"
)
func main() {
var num int64 = 200
var result int8 = int8(num)
fmt.Printf("原始值: %d, 转换后的值: %d\n", num, result)
}
在上述代码中,int64
类型的200
超出了int8
类型的范围(int8
范围是-128
到127
),强制转换后会截断,200
的二进制表示为11001000
,截断后保留低8位11001000
,解释为有符号int8
类型就是-56
。
3. 避免问题的方法:
- 提前检查:在转换前检查值是否在目标类型范围内。例如:
package main
import (
"fmt"
)
func main() {
var num int64 = 200
if num >= int64(int8(-128)) && num <= int64(int8(127)) {
var result int8 = int8(num)
fmt.Printf("原始值: %d, 转换后的值: %d\n", num, result)
} else {
fmt.Println("值超出int8范围,无法安全转换")
}
}
- **使用溢出处理函数**:在某些情况下,可以使用`math`包中的函数来处理溢出,如`math.MaxInt8`、`math.MinInt8`,来判断是否会溢出,从而决定如何处理该值,比如返回错误或者进行其他合适的处理。