有什么具体让你困惑的地方吗? 有多种数值表示类型。应该选择最适合任务的类型。
// 代码示例保留原样
那么高精度意味着使用 float64。
那么这是否意味着需要用 64 位来编写它们?
这是否就是 …Big = 1 << 100 的情况?
正确。
明白了
[!quote] skillian https://play.golang.org/p/_Aj2exz2c7o
感谢如此详细的说明!我稍后会再仔细研究。我的电脑快没电了!
字面量是高精度值并不意味着它们就是浮点数。这意味着它们会尽可能长时间地保持原始的完整值。只有将它们"强制"转换为特定类型时,才会使其成为该类型并根据需要降低精度。在 Go 语言中,没有哪种类型能够以整数值的形式存储相当于 2 的 100 次方的字面量。
这就是为什么在示例代码中不能将其与 needsInt 一起使用的原因。
嗨,Cherolyn,
当你只是陈述事实时,这让我想回复:“挺好的呢” 😛
请提出具体问题。或许你可以找出程序中最初不理解的部分,然后针对那部分进行提问。
分而治之。逐个模块分析,看看是否能理解每个部分。
你理解 << 运算符的作用吗?
// 代码示例保留原文
4 个赞
上面的代码中有相关注释:
// Create a huge number by shifting a 1 bit left 100 places.
// In other words, the binary number that is 1 followed by 100 zeroes.
Big = 1 << 100
如果你想深入了解,这里有一篇不错的文章,不过我认为你现在可以暂时不用太关注这些运算符。
cherilexvold1974:
数值常量是高精度值…什么是高精度值?我以前从未听说过这个术语
应该从字面理解。
Go有两种浮点类型 - float32和float64。 float32在内存中占用32位,以单精度浮点格式存储值。 float64在内存中占用64位,以双精度浮点格式存储值。
所以高精度指的是float64。
cherilexvold1974:
这就是…Big = 1 << 100的情况吗?
正确。
数值常量是高精度的值……什么是高精度值?我以前从未听说过这个术语。
我尝试了:尝试也打印 needInt(Big),然后得到:
./prog.go:20:30: 语法错误:意外的换行符,期望逗号或右括号
./prog.go:21:28: 语法错误:语句末尾出现意外的右括号
// 通过将1的二进制位左移100位来创建一个巨大的数字。我该怎么做?
// 这是不是这样实现的……Big = 1 << 100?
// 再将其右移99位,这样我们最终得到1<<1,即2。
Small = Big >> 99
我想我开始明白了。
func needInt(x int) int { return x*10 + 1
……(x int) 这是参数吗?……x*10 是指 x 乘以 10 吗?
这是个开始。
cherilexvold1974:
数值常量是高精度值……什么是高精度值?我以前从未听说过这个术语
在许多编程语言中,常量(例如代码中的字面数字)都有相关联的数据类型。在Go语言中,常量可以说是"薛定谔式"的,它们在"被观测"之前没有类型。这里的"观测"指的是在运行时被读取或写入。
以下是我用字符串整理的一个示例:Go Playground - Go编程语言
在Go语言教程的示例中,常量Big被定义为值1 << 100。这个表达式表示将1的概念位向左移动100个位置。如今大多数计算机都是64位的,因此移动100位的位会"溢出",最终得到一些无效结果,如0或-1。如果随后将该结果向右移动99位,就像在Small的定义示例中那样,最终会得到其他无效和/或意外的值。
我对这个示例目的的理解是:当使用常量时,它们没有数据类型,因此可以定义巨大的常量,然后通过对先前常量的表达式来构建其他常量(比如Small被定义为Big >> 99)。只有当尝试在代码中使用这些常量时,数据类型才会根据常量被赋值的变量类型来决定。
func main() {
fmt.Println("hello world")
}
在Go语言中,数值常量是未类型化的(untyped),这意味着它们没有固定的数据类型(如int、float64等),直到在表达式中被使用时才根据上下文确定类型。这提供了更大的灵活性和精度,尤其是在处理高精度计算时。
以下是一个示例,展示数值常量的行为:
package main
import "fmt"
const (
Big = 1 << 100 // 创建一个非常大的数值常量(2^100)
Small = Big >> 99 // 通过右移得到一个小值(2^1 = 2)
)
func main() {
// 下面这行会导致编译错误,因为Big太大,无法赋值给int类型
// fmt.Println(Big)
// 但Small可以安全地用于int类型
fmt.Println(Small) // 输出: 2
// 数值常量在表达式中根据上下文确定类型
var x int = Small * 10
fmt.Println(x) // 输出: 20
// 浮点数上下文
var y float64 = Small * 0.5
fmt.Println(y) // 输出: 1
// 常量可以用于需要高精度的计算
const precise = 123456789012345678901234567890
fmt.Println(precise / 1000000000000000000000000000) // 输出: 123
}
关键点:
- 数值常量在编译时处理,可以拥有任意精度。
- 它们只在需要类型化的上下文中(如变量赋值、函数参数传递)才转换为具体类型。
- 如果常量值超出目标类型的范围,编译时会报错。
在您提供的链接中,Big常量(1 << 100)太大,无法直接赋值给标准整数类型,但可以通过运算(如右移)得到适合的值。

