提问人:Marc Le Bihan 提问时间:5/26/2023 最后编辑:Marc Le Bihan 更新时间:5/26/2023 访问量:101
uint(-5.0),其中参数是 float64,= 18446744073709551611?
uint(-5.0), where parameter is a float64, = 18446744073709551611?
问:
在 Go 教程的第 13 步中,我稍微更改了脚本
package main
import (
"fmt"
"math"
)
func main() {
var x, y int = 3, 4
var f float64 = math.Sqrt(float64(x*x + y*y))
var z uint = uint(f)
fmt.Println(x, y, z, f)
}
这返回:3 4 5 5,很好。
但是当我做这个改变时:否定:f
func main() {
var x, y int = 3, 4
var f float64 = - math.Sqrt(float64(x*x + y*y))
var z uint = uint(f)
fmt.Println(x, y, z, f)
}
它响应:3 4 18446744073709551611 -5
为什么该方法将 -5.0 转换为 18446744073709551611?uint
难道没有东西 - 算法吗?- 试图检查它在下面做什么?
这就像该方法在二进制级别上残酷地从带有尾数和指数的浮点数转换为整数?uint
发生了什么事情?
如果我被误导了,并且这些方法不是我认为的转换函数,
而是像您在 C 中找到的转换方法,那么确保以下条件的转换函数
是什么:uint
(uint)f
uint z = anotherFunction(any float64)
将返回该浮点数的正整数值吗?
答:
的值为负数:。当您将其转换为无符号类型的值时,您会期望什么?无符号类型具有有效的范围/表示形式,其中没有空间。f
-5.0
-5
Go(像大多数其他语言一样)使用 2 的补码来表示整数。将有符号整数转换为无符号整数时,将保留表示形式(内存中的二进制数据),但数字的解释方式会有所不同。
通常,将负符号值转换为无符号值时,可以使用以下方法计算结果:
result: MAX_VALUE + x + 1 = MAX_VALUE - ABS(x) + 1
因此,例如,当将类型转换为 时,结果将是:-5
int8
uint8
255 - 5 + 1 = 251
将类型转换为:-5
int64
uint64
18446744073709551615 - 5 + 1 = 18446744073709551611
(注意:和的大小取决于平台,在 Go Playground 上,它的大小为 64 位,与 和 相同。int
uint
int64
uint64
最后一个缺失的部分:your 是 类型 。从规范转换为整数: 转换: 数值类型之间的转换:f
float64
float64
对于非常量数值的转换,适用以下规则:
[...]
- 将浮点数转换为整数时,分数将被丢弃(截断为零)。
所以被转换为 ,那么可以使用上面的算法来解释为类型的值时会是什么样子。-5.0
-5
uint
评论
uint
不是一种方法,而是一种类型。 是转换表达式,因此是将 的值转换为 类型的值的转换。的取值范围是通过,注意不能保存负值,还要注意非常量值的转换总是产生一个有效值;没有溢出的迹象。T(x)
uint(f)
f
uint
uint
0
18446744073709551615
uint
uint(math.Abs(f))
@MarcLeBihan13840687554816376832
float64
uint64