当前位置: 首页 > 面试题库 >

Golang:二进制补码和fmt.Printf

甘骞尧
2023-03-14
问题内容

因此,计算机使用二进制补码在内部表示有符号整数。即,-5表示为^ 5 +1 =“ 1111 1011”。

但是,尝试打印二进制表示形式,例如以下代码

var i int8 = -5
fmt.Printf("%b", i)

输出-101。不太符合我的期望。格式是不同的还是还是不使用二进制补码?

有趣的是,转换为无符号int会导致“正确”位模式:

var u uint8 = uint(i)
fmt.Printf("%b", u)

输出是11111011-的2s补码-5

因此,在我看来,值内部实际上是在使用二进制补码,但格式是打印无符号5并加a -

有人可以澄清吗?


问题答案:

我相信答案在于fmt模块如何格式化二进制数,而不是内部格式。

如果您看一看fmt.integer,该函数首先执行的操作之一就是将负有符号整数转换为正整数:

   165      negative := signedness == signed && a < 0
   166      if negative {
   167          a = -a
   168      }

然后,可以-在此处输出的字符串前面附加逻辑。

IOW -101确实-附加到5二进制文件中。

注意:fmt.integerpp.fmtInt64在print.go中调用的,本身是pp.printArg在同一函数中调用的。



 类似资料:
  • 问题内容: 我知道用和 将小数转换为二进制(在这里我取32位结果的低16位)。 我想做的是另一种方法,并采用16位二进制补码二进制字符串并将其转换为十进制。 即 而不是 我该怎么做? 问题答案: 您需要将结果读取到中。 此打印。

  • 问题内容: Python中的整数以二进制补码存储,对吗? 虽然: 和: 真是la脚。如何获取python以实数二进制位给我数字,并且没有0b开头?所以: 问题答案: 不确定如何使用标准库获取所需的内容。那里有一些脚本和软件包可以为您完成转换。 我只是想指出“为什么”以及为什么它不la脚。 bin()不返回二进制位。它将数字转换为二进制字符串。根据python语言定义,前导‘0b’告诉解释器您正在处

  • 问题内容: 我想使用二进制补码表示一位负整数。使用标准的Python位表示实用程序并没有多大帮助: 的补码形式为。我该怎么做呢? 问题答案: Python的整数已经使用二进制补码,但是由于它们具有任意精度,因此负数的二进制表示形式在开始时将具有一个无限的1s字符串,就像正数具有一个无限的0s字符串一样。由于显然无法显示,因此用负号代替。 如果您想要特定宽度的二进制表示形式,则可以使用模数。

  • 1)11111111>0111111 我认为这是错误的,因为第一个数字代表符号,所以我们比较负值和正值。 2)(11111111+11111111)>(00000001-00000010) 谢谢你。

  • 将二进制补码转换为十进制最简单的方法是什么?例如,如果我通常将“1001”之类的字符串转换为十进制,则得到9。但我实际上想得到一个简单的-7。你们有什么建议?,

  • 问题内容: 我有一个二进制字符串,如下所示: 我希望我的INT的值是代替 实现此目标的最佳方法是什么? 问题答案: 使用Where 是您的方案无法表示的最小正数。(在这种情况下为8,因为为7且为负。) 大于,所以你减去的,给。