Golang中的数值常量详解

Golang中的数值常量详解 https://tour.golang.org/basics/16

我完全无法理解这部分内容。

12 回复

不,我不明白那个运算符的作用

更多关于Golang中的数值常量详解的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


有什么具体让你困惑的地方吗? 有多种数值表示类型。应该选择最适合任务的类型。

// 代码示例保留原样

那么高精度意味着使用 float64。

那么这是否意味着需要用 64 位来编写它们?

这是否就是 …Big = 1 << 100 的情况?

正确。

明白了

GreyShatter:

Go语言的位操作技巧

Go语言的位操作技巧

感谢!正在阅读这篇文章。

[!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

如果你想深入了解,这里有一篇不错的文章,不过我认为你现在可以暂时不用太关注这些运算符。

使用Go进行位操作技巧

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)太大,无法直接赋值给标准整数类型,但可以通过运算(如右移)得到适合的值。

回到顶部