在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
答案 0 :(得分:2)
我怀疑gdb在设置数字值的类型后应用了一元否定运算符:
在案例1中:gdb解析2147483648
类型溢出int
并变为unsigned int
。然后它适用否定。
在案例2中:2147483647
是有效的int
,并在随后应用否定和减法时保持为int。
答案 1 :(得分:1)
gdb
似乎遵循一套规则来确定与C标准给出的规则不一致的十进制整数文字的类型。
我假设你的系统有32位int
和long int
类型,使用2的补码而没有填充位(这是32位系统的常见选择,并且它与你看到了什么)。然后int
和unsigned int
的范围是:
int
:-2147483648
.. +2147483647
unsigned int
:0
.. 4294967295
且long int
和unsigned long int
的范围相同。
2147483647
在int
类型的范围内,因此就是它的类型。
由于2147483648
的值超出了int
类型的范围,显然gdb
选择将其视为unsigned int
。 -2147483648
不是整数文字,它是一个表达式,由一个应用于常量-
的一元2147483648
运算符组成。由于gdb
将2147483648
视为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规则来表示整数文字。