在 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
我怀疑 gdb 在设置数字值的类型后应用了一元否定运算符:
情况 1:gdb 解析2147483648
哪个溢出int
类型并变成unsigned int
. 然后它应用否定。
在情况 2:2147483647
是有效的int
并且在随后应用否定和减法时保持 int 。
gdb
似乎遵循一组规则来确定与 C 标准给出的规则不一致的十进制整数文字的类型。
我假设您的系统具有 32 位int
和long 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 ,并且无符号类型的一元运算符环绕,产生。-
2147483648
gdb
2147483648
unsigned int
-2147483648
unsigned 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 规则用于整数文字。