Go语言整数转十六进制疑问:结果为何不符补码预期?
Go整数转补码十六进制的解决方案
问题原因
fmt.Sprintf("%X", d)处理有符号整数时,会直接对数值的绝对值转十六进制并保留负号,不会输出补码形式的十六进制,所以你得到了-3039而非预期的补码结果。
解决方法
要得到补码的十六进制表示,只需将有符号整数转换为对应位数的无符号整数类型,再进行格式化:
示例1:获取16位补码十六进制
package main import ( "fmt" ) func main() { d := -12345 // 将int转为uint16,按补码规则转换为无符号值 hex := fmt.Sprintf("%X", uint16(d)) fmt.Println(hex) // 输出 CFC7 }
示例2:获取32位补码十六进制
如果需要32位宽度的补码结果,可转换为uint32:
package main import ( "fmt" ) func main() { d := -12345 hex := fmt.Sprintf("%X", uint32(d)) fmt.Println(hex) // 输出 FFFFCFC7 }
说明
转换时选择的无符号类型位数决定了输出的十六进制长度:
uint16对应4位十六进制(16位补码)uint32对应8位十六进制(32位补码)uint64对应16位十六进制(64位补码)
根据实际需求选择匹配的类型即可得到对应位数的补码十六进制结果。
内容的提问来源于stack exchange,提问作者Алексей Иванов
相关产品推荐
相关产品推荐

