C++ 为什么将float64转换为int32会在Go中给出一个负数?
偶尔,我们在Golang错误地直接将C++ 为什么将float64转换为int32会在Go中给出一个负数?,c++,go,floating-point,ieee-754,C++,Go,Floating Point,Ieee 754,偶尔,我们在Golang错误地直接将float64转换为int32 raw=529538871408 fv=64(原始) fmt.Println(原始) fmt.Println(fv) 格式打印LN(int32(fv)) 输出 529538871408 5.29538871408e+11 -2147483648 为什么int32(fv)给定一个负数 < >我们知道,C++中的长< /C> >和 FLUAT64/代码>在Golang中是64位IEEE 754双精度。所以我们在C中
float64
转换为int32
raw=529538871408
fv=64(原始)
fmt.Println(原始)
fmt.Println(fv)
格式打印LN(int32(fv))
输出
529538871408
5.29538871408e+11
-2147483648
为什么int32(fv)
给定一个负数
< >我们知道,C++中的<代码>长< /C> >和<代码> FLUAT64/代码>在Golang中是64位IEEE 754双精度。所以我们在C中尝试相同的代码++
int64_t iv=529538871408;
在go中,可以溢出到符号位
package main
import (
"fmt"
)
func main() {
a, b := int32(2147483647), int32(1)
c := a + b
fmt.Printf("%d %T", c, c)
}
我不知道golang
,但int32
表示范围[-2147483648,2147483647]
(两个字的恭维)。529538871408>2^31所以,溢出。符号溢出可能在“代码> GORANG/CODER >中是可以的,但是它们不是C++(直到C++ 20)。“为什么In32(Fv)给出了负数?”因为语言规范说必须这样做。你在GO中做了一些不明确的事情:“Volker,你能让我看看语言规范的链接吗?”
package main
import (
"fmt"
)
func main() {
a, b := int32(2147483647), int32(1)
c := a + b
fmt.Printf("%d %T", c, c)
}