面试题答案
一键面试不同整型数据类型转换注意点
- 精度丢失:当从范围大的整型转换为范围小的整型时,可能会丢失高位数据。例如从
int64
转换为int8
。 - 溢出:转换后的值超出目标类型的范围,就会发生溢出。比如将一个很大的
int32
值转换为int16
。
溢出情况举例
package main
import (
"fmt"
)
func main() {
var largeInt int32 = 32768
var smallInt int16 = int16(largeInt)
fmt.Printf("转换前: %d, 转换后: %d\n", largeInt, smallInt)
}
在上述代码中,int32
类型的 32768
超出了 int16
类型的范围(int16
范围是 -32768
到 32767
),转换后会发生溢出,smallInt
的值实际为 -32768
(因为在计算机中以补码形式存储,溢出后结果是取模后的补码值)。
处理溢出问题的方法
- 范围检查:在转换前检查值是否在目标类型的范围内。
package main
import (
"fmt"
)
func main() {
var largeInt int32 = 32768
if largeInt >= int32(math.MinInt16) && largeInt <= int32(math.MaxInt16) {
var smallInt int16 = int16(largeInt)
fmt.Printf("转换前: %d, 转换后: %d\n", largeInt, smallInt)
} else {
fmt.Println("值超出目标类型范围,无法安全转换")
}
}
这里使用 math.MinInt16
和 math.MaxInt16
获取 int16
类型的范围进行检查。
2. 错误处理:可以封装转换函数,在发生溢出时返回错误。
package main
import (
"errors"
"fmt"
"math"
)
func safeConvertToInt16(num int32) (int16, error) {
if num >= int32(math.MinInt16) && num <= int32(math.MaxInt16) {
return int16(num), nil
}
return 0, errors.New("值超出int16范围")
}
func main() {
var largeInt int32 = 32768
result, err := safeConvertToInt16(largeInt)
if err != nil {
fmt.Println(err)
} else {
fmt.Printf("转换结果: %d\n", result)
}
}
这样通过错误处理机制,可以在发生溢出时告知调用者,确保程序的稳定性和正确性。