C 否定运算符在 Debian 终端中打印意外结果

标签 c gdb

这纯粹是学术性的,但我已经用 C 语言创建了一个简单的真值表:

#include <stdio.h>

int main() {
  for(int j=0; j<=2; j++) {
    int bitB = (j&1);
    printf("~%d = %d\n", bitB, ~bitB);
  }
  return 0;
}

运行终端 yield :

~1 = -2
~0 = -1

通过在 printf 上设置中断在 gdb 中进行调试会产生我所期望的结果,但是:

(gdb) print bitB
$5 = 1
(gdb) cont
Continuing.
~1 = -2
(gdb) x/xw &bitB
0xbffff3d8: 0x00000000

为什么程序输出显示负数?

最佳答案

这是一个完美的预期结果,至少在 two's complement system 中表示负数的系统上是这样。 :

  • 负一表示为所有位都设置为1,并且
  • 负二的所有位都设置为 1,除了最后一位。

因此,翻转零的所有位产生 -1,翻转 1 的所有位产生 -2:

0000000000000000 -> 1111111111111111 // Zero becomes negative 1
0000000000000001 -> 1111111111111110 // One becomes negative 2

从数学上讲,要翻转二进制补码表示中数字的符号,您需要翻转数字的所有位,然后将 1 添加到结果中。简单地翻转 x 的所有位产生 -x-1。这正是您看到的结果。

Why is the program output showing negative numbers?

因为您使用带符号的 int%d 格式说明符,并且您打印的位模式恰好是负数的表示形式。

关于C 否定运算符在 Debian 终端中打印意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43431704/

相关文章:

c++ - 如何防止 cuda-gdb 中的 <optimized out> 值

GDB 信息寄存器命令 - 输出的第二列

c - 检索 PID 时 pclose 随机出现段错误

通过命令行进行字符替换

C 相同输出不同结果

C编程读取输入错误检查

python - GDB pretty-print : returning string from a children()'s iterator, 但显示为 char[]

java - 以不可移植语言(即 C/C++)编写的程序的可移植性

c - C 中的字符串动态分配

linux - 从可执行文件中转储 debug_loc 部分