Go使用位操作计算字符串ASCII和结果与JavaScript不一致如何解决
差异根因
- JavaScript 中的位运算默认基于32位有符号整数执行,你代码中的
t &= t操作会自动将结果截断为32位有符号整数,溢出的高位会直接丢弃。 - Go 语言的
int类型属于平台相关类型,64位系统下默认是64位有符号整数,运算过程中不会自动做32位截断,当累加结果超出32位整数范围后,就会和JS的输出结果出现差异。 - 你现有Go代码中封装的
CharCodeAt函数逻辑冗余,对于ASCII字符直接取字符串下标对应的字节转整数即可得到对应ASCII码,不需要额外做rune、string类型转换。
修复后代码
package main import ( "fmt" ) func main() { fmt.Println(CountChars("Google")) // 输出 2138589785,与JS结果一致 fmt.Println(CountChars("Google1")) // 输出 1871773944,与JS结果一致 } func CountChars(char string) int32 { // 明确使用32位有符号整数,完全对齐JS的运算逻辑 var sum int32 = 0 if char == "" { return sum } for x := 0; x < len(char); x++ { sum = (sum << 5) - sum + int32(char[x]) sum &= sum } return sum }
内容的提问来源于stack exchange,提问作者Kompocik
相关产品推荐
相关产品推荐

