【发布时间】:2021-12-30 15:07:44
【问题描述】:
使用 glibc 中的stdint.h(gcc SUSE Linux 版本 9.2.1,Intel Core I7 处理器)我在直接打印 INT32_MIN 时遇到了一个最奇怪的行为:
#include <stdio.h>
#include <stdint.h>
void main(void)
{
printf("%d\n", INT16_MIN);
int a = INT16_MIN;
printf("%d\n", a);
printf("%ld\n", INT32_MIN);
long b = INT32_MIN;
printf("%ld\n", b);
printf("%ld\n", INT64_MIN);
long c = INT64_MIN;
printf("%ld\n", c);
}
哪个输出:
-32768
-32768
2147483648
-2147483648
-9223372036854775808
-9223372036854775808
此外,如果我尝试
printf("%ld\n", -INT32_MIN);
我得到相同的结果,但编译器 warning: integer overflow in expression '-2147483648' of type 'int' results in '-2147483648' [-Woverflow]。
并不是说这对任何现有程序都非常糟糕,实际上它看起来很无害,但这是旧 printf 中的一个错误吗?
【问题讨论】:
-
我很确定这是未定义的行为,
'%ld'会期待long intiirc。 -
但是当我从
long b打印时它可以工作,还有编译器警告,当使用%dINT32_MIN时仍然存在。 -
这是未定义的行为,它可以为所欲为。它可能是对的,也可能是大错特错。是的,如果您打印它期望的格式,它会起作用,我不确定为什么这会表明 UB 是一个错误?
-
啊,好吧,你们是对的,这很奇怪,但它未按标准定义,
%d工作正常,谢谢! -
请注意,
-INT32_MIN也是未定义的行为:有符号整数溢出。
标签: c printf glibc stdio stdint