gpt4 book ai didi

go - int 与 int32 返回值

转载 作者:IT王子 更新时间:2023-10-29 01:18:11 28 4
gpt4 key购买 nike

我遇到了一个问题,这似乎与 int32int 数据类型有关。我的程序在不同的环境中返回不同的值。

例如,在 go playground 上,我注意到返回值是 -4(这是预期值)。但是在 Leetcode 上相同的输入返回值 4294967292。当它返回这个值时,当我打印它时,我得到 -4(见后面添加的输出)。

我尝试转换为 int32(res) 但没有帮助。也没有在教科书中找到任何直接相关的内容。请帮助我理解为什么 go playground 与 Leetcode 不同。

https://play.golang.org/p/qXMd9frlhbe

package main

import (
"fmt"
)

func main() {
fmt.Printf("%v", singleNumber([]int{-2,-2,1,1,-3,1,-3,-3,-4,-2}))
}

func singleNumber(nums []int) int {
sum := make([]int, 32)

for _, v := range nums {
for i := 0; i < 32; i++ {
if sum[i] != 0 {
sum[i] += 1 & (v >> uint32(i))
} else {
sum[i] = 1 & (v >> uint32(i))
}
}
}

res := 0
for k, v := range sum {
if (v%3) != 0 {
res |= (v%3) << uint32(k)
}
}
fmt.Printf("res %+v\n", res)
return res
}

同样在 Leetcode 上给出了输出:

Input:
[-2,-2,1,1,-3,1,-3,-3,-4,-2]
Output:
4294967292
Expected:
-4
Stdout:
res -4

最佳答案

你要找的教材是

The Go Programming Language Specification

Numeric types

A numeric type represents sets of integer or floating-point values. The predeclared architecture-independent numeric types are:

uint32 set of all unsigned 32-bit integers (0 to 4294967295)
uint64 set of all unsigned 64-bit integers (0 to 18446744073709551615)

int32 set of all signed 32-bit integers (-2147483648 to 2147483647)
int64 set of all signed 64-bit integers (-9223372036854775808 to 9223372036854775807)

There is also a set of predeclared numeric types with implementation-specific sizes:

uint either 32 or 64 bits
int same size as uint

检查 int 类型的大小。在 Go Playground 上,它是 4 个字节或 32 位。

package main

import (
"fmt"
"runtime"
"unsafe"
)

func main() {
fmt.Println("arch", runtime.GOARCH)
fmt.Println("int", unsafe.Sizeof(int(0)))
}

Playground :https://play.golang.org/p/2A6ODvhb1Dx

输出( Playground ):

arch amd64p32
int 4

在您的 (LeetCode) 环境中运行该程序。可能是 8 个字节或 64 位。

例如,在我的环境中,

输出(本地):

arch amd64
int 8

这是对您的代码的一些修复,

package main

import (
"fmt"
"runtime"
)

func main() {
fmt.Println(runtime.GOARCH)
fmt.Printf("%v\n", singleNumber([]int{-2, -2, 1, 1, -3, 1, -3, -3, -4, -2}))
}

func singleNumber(nums []int) int {
sum := make([]int, 64)

for _, v := range nums {
for i := range sum {
sum[i] += 1 & (v >> uint(i))
}
}

res := 0
for k, v := range sum {
if (v % 3) != 0 {
res |= (v % 3) << uint(k)
}
}
fmt.Printf("res %+v\n", res)
return res
}

Playground :https://play.golang.org/p/kaoSuesu2Oj

输出( Playground ):

amd64p32
res -4
-4

输出(本地):

amd64
res -4
-4

关于go - int 与 int32 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51852678/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com