int vs int32返回值

Gau*_*nha 2 go

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

例如,在go playground上,我注意到返回的值是-4(这是预期值).但是在相同输入的Leetcode上返回相同的值会返回4294967292.当它返回此值时,当我打印它时,我得到-4(稍后会看到输出).

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

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
}
Run Code Online (Sandbox Code Playgroud)

Leetcode上的相同内容给出了输出: -

Input:
[-2,-2,1,1,-3,1,-3,-3,-4,-2]
Output:
4294967292
Expected:
-4
Stdout:
res -4
Run Code Online (Sandbox Code Playgroud)

pet*_*rSO 9

你正在寻找的教科书是

Go编程语言规范

数字类型

数字类型表示整数或浮点值的集合.预先声明的与体系结构无关的数字类型是:

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)
Run Code Online (Sandbox Code Playgroud)

还有一组具有特定于实现的大小的预先声明的数字类型:

uint either 32 or 64 bits
int  same size as uint
Run Code Online (Sandbox Code Playgroud)

检查类型的大小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)))
}
Run Code Online (Sandbox Code Playgroud)

游乐场:https://play.golang.org/p/2A6ODvhb1Dx

输出(游乐场):

arch amd64p32
int 4
Run Code Online (Sandbox Code Playgroud)

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

例如,在我的环境中,

输出(本地):

arch amd64
int 8
Run Code Online (Sandbox Code Playgroud)

以下是对代码的一些修复,

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
}
Run Code Online (Sandbox Code Playgroud)

游乐场:https://play.golang.org/p/kaoSuesu2Oj

输出(游乐场):

amd64p32
res -4
-4
Run Code Online (Sandbox Code Playgroud)

输出(本地):

amd64
res -4
-4
Run Code Online (Sandbox Code Playgroud)

  • TIL - 这很有趣,因为这使得代码平台依赖(我的意思是 int 大小依赖于平台)。感谢您的回答。 (2认同)