Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

var maxVal int = int(^uint(0) >> 1) #667

Open
981377660LMT opened this issue Dec 18, 2024 · 1 comment
Open

var maxVal int = int(^uint(0) >> 1) #667

981377660LMT opened this issue Dec 18, 2024 · 1 comment

Comments

@981377660LMT
Copy link
Owner

No description provided.

@981377660LMT
Copy link
Owner Author

var maxVal int = int(^uint(0) >> 1) 这一行代码在 Go 语言中用于计算并赋值给 maxVal 变量一个 int 类型的最大可能值。下面详细解释这行代码的每个部分及其作用。

代码解析

var maxVal int = int(^uint(0) >> 1)
  1. uint(0):

    • 这是一个无符号整数类型的字面值,值为 0
    • uint 的大小依赖于系统架构(32 位或 64 位),但它总是一个无符号的整数。
  2. ^uint(0):

    • ^ 是按位取反(位反)操作符。
    • uint(0) 进行按位取反操作,会将所有的位从 0 变为 1
    • 例如,在 32 位系统中,uint(0)0x00000000,取反后为 0xFFFFFFFF
    • 在 64 位系统中,取反后为 0xFFFFFFFFFFFFFFFF
  3. ^uint(0) >> 1:

    • >> 1 是右移操作,将所有位向右移动一位。
    • 0xFFFFFFFF(32 位)进行右移一位,得到 0x7FFFFFFF
    • 0xFFFFFFFFFFFFFFFF(64 位)进行右移一位,得到 0x7FFFFFFFFFFFFFFF
    • 这样做的目的是将最高位(原本为 1)变为 0,从而得到一个有符号整数的最大值。
  4. int(^uint(0) >> 1):

    • 将右移后的无符号整数转换为有符号的 int 类型。
    • 在有符号整数中,最高位(符号位)为 0 表示正数,1 表示负数。
    • 因此,0x7FFFFFFF(32 位)对应的有符号整数最大值为 2147483647
    • 0x7FFFFFFFFFFFFFFF(64 位)对应的有符号整数最大值为 9223372036854775807
  5. var maxVal int = ...:

    • 最终,将计算得到的最大有符号整数值赋给 maxVal 变量。

为什么这样计算 int 的最大值?

Go 语言中没有像 C/C++ 中的 INT_MAX 这样的预定义常量。因此,开发者需要通过位操作来计算 int 类型的最大值。上述方法利用了无符号整数的位反操作和右移操作,巧妙地得到了有符号整数的最大值。

示例

假设我们在一个 64 位系统上运行以下代码:

package main

import (
	"fmt"
)

func main() {
	var maxVal int = int(^uint(0) >> 1)
	fmt.Println(maxVal) // 输出: 9223372036854775807
}

输出将会是:

9223372036854775807

这是 64 位有符号整数 int 的最大值。

通用性

这种方法具有跨平台的通用性,因为它依赖于 uint 类型的位数,而 int 的位数在不同系统上(32 位或 64 位)会自动适应。因此,无论代码运行在哪种架构上,maxVal 都会正确地反映出当前系统上 int 类型的最大值。

总结

var maxVal int = int(^uint(0) >> 1) 通过以下步骤计算出 int 类型的最大值:

  1. 创建一个全为 1 的无符号整数。
  2. 右移一位,将最高位设为 0,得到有符号整数的最大值。
  3. 将结果转换为 int 类型并赋值给 maxVal

这种技巧在需要程序matically 获取数据类型的边界值时非常有用,尤其是在编写与系统架构无关的通用代码时。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant