在gdb -2147483648 = 2147483648

时间:2013-10-26 07:07:29

标签: gcc gdb

在gdb中,

(gdb) p -2147483648
$28 = 2147483648
(gdb) pt -2147483648
type = unsigned int

由于-2147483648属于int类型的范围,为什么gdb会将其视为unsigned int

(gdb) pt -2147483647-1
type = int
(gdb) p -2147483647-1
$27 = -2147483648

2 个答案:

答案 0 :(得分:2)

我怀疑gdb在设置数字值的类型后应用了一元否定运算符:

在案例1中:gdb解析2147483648类型溢出int并变为unsigned int。然后它适用否定。

在案例2中:2147483647是有效的int,并在随后应用否定和减法时保持为int。

答案 1 :(得分:1)

gdb似乎遵循一套规则来确定与C标准给出的规则不一致的十进制整数文字的类型。

我假设你的系统有32位intlong int类型,使用2的补码而没有填充位(这是32位系统的常见选择,并且它与你看到了什么)。然后intunsigned int的范围是:

  • int-2147483648 .. +2147483647
  • unsigned int0 .. 4294967295

long intunsigned long int的范围相同。

2147483647int类型的范围内,因此就是它的类型。

由于2147483648的值超出了int类型的范围,显然gdb选择将其视为unsigned int-2147483648不是整数文字,它是一个表达式,由一个应用于常量-的一元2147483648运算符组成。由于gdb2147483648视为unsigned int,因此它还将-2147483648视为unsigned int,而对于无符号类型的一元-运算符则会,屈服于2147483648

对于-2147483647-1,这是一个表达式,其所有操作数都是int类型,并且没有溢出。

但是,在所有版本的ISO C中,未加语句的十进制文字永远不能是unsigned int类型。在C90中,它的类型是第一个:

  • int
  • long int
  • unsigned long int

可以代表它的价值。在C99规则(及更高版本)下,十进制整数常量的类型是第一个:

  • int
  • long int
  • long long int

可以代表它的价值。

我不知道是否有办法告诉gdb使用C规则来表示整数文字。