1

在 gdb 中,

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

既然-2147483648在 type 的范围内int,为什么 gdb 把它当作一个unsigned int?

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

2 回答 2

2

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

情况 1:gdb 解析2147483648哪个溢出int类型并变成unsigned int. 然后它应用否定。

在情况 2:2147483647是有效的int并且在随后应用否定和减法时保持 int 。

于 2013-10-26T15:54:53.613 回答
1

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

我假设您的系统具有 32 位intlong int类型,使用 2 的补码并且没有填充位(这是 32 位系统的常见选择,并且与您所看到的一致)。int那么和的范围unsigned int是:

  • int: -2147483648..+2147483647
  • unsigned int: 0..4294967295

long int和的范围unsigned long int相同。

2147483647在 type 的范围内int,所以这就是它的类型。

由于 的值2147483648超出了 type 的范围int,显然gdb是选择将其视为unsigned int. And-2147483648不是整数文字,它是由应用于常量的一元运算符组成的表达式。由于视为an ,它也视为an ,并且无符号类型的一元运算符环绕,产生。-2147483648gdb2147483648unsigned int-2147483648unsigned int-2147483648

至于-2147483647-1,这是一个所有操作数都是 type 的表达式int,并且没有溢出。

但是,在所有版本的 ISO C 中,无后缀的十进制文字永远不能是unsigned int. 在 C90 中,它的类型是第一个:

  • int
  • long int
  • unsigned long int

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

  • int
  • long int
  • long long int

可以代表它的价值。

我不知道是否有办法告诉gdb将 C 规则用于整数文字。

于 2013-10-26T23:48:35.583 回答