为了账号安全,请及时绑定邮箱和手机立即绑定

int 与 int32 返回值

int 与 int32 返回值

Go
函数式编程 2023-03-21 15:04:06
int32我遇到了一个问题,这似乎与vs数据类型有关int。我的程序在不同的环境中返回不同的值。例如,在 go playground 上,我注意到返回的值为 -4(这是预期值)。但是在 Leetcode 上相同的输入返回值 4294967292。当它返回这个值时,当我打印它时,我得到 -4(见后面添加的输出)。我尝试投射到int32(res)但没有帮助。也没有在教科书中找到任何直接相关的内容。请帮助我理解为什么 go playground 与 Leetcode 不同。https://play.golang.org/p/qXMd9frlhbepackage mainimport (    "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:4294967292Expected:-4Stdout:res -4
查看完整描述

1 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

您要查找的教科书是

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)

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


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)))

}

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


输出(游乐场):


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

}

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


输出(游乐场):


amd64p32

res -4

-4

输出(本地):


amd64

res -4

-4


查看完整回答
反对 回复 2023-03-21
  • 1 回答
  • 0 关注
  • 81 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信