go - int vs int32 返回值
问题描述
我遇到了一个问题,这似乎与int32
vsint
数据类型有关。我的程序在不同的环境中返回不同的值。
例如,在去操场上,我注意到返回的值是 -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
解决方案
你要找的教科书是
数字类型表示整数或浮点值的集合。预先声明的独立于体系结构的数字类型是:
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
推荐阅读
- python - FCBF Python 特征选择技术
- python - 卷积神经网络性能的奇怪模式
- node.js - NodeJS:检测用户是否对文件具有读取权限
- javascript - $.each 函数替换为 for 循环
- c# - EF5 IQueryable 不包含 ToListAsync 的定义
- react-router - react-router 内联渲染道具(Auth0 回调)
- php - MySQL 不执行更新
- css - 将 div 对齐到底部:我是否错误地使用了“align-content-end”?
- bash - 从 AWK 构建 bash 数组
- mysql - MySQL查询以计算按日期范围分组的行