This question already has answers here:
Closed last year.
Is conversion from unsigned to signed undefined?
(3个答案)
Unsigned to signed conversion in C
(1个答案)
如果我使用了错误的格式说明符,例如:
unsigned int i = -1;
printf("%d\n", i);

由于%u的格式说明符unsigned而调用未定义的行为。
C11标准第7.21.6.1节(第9页):
如果转换规范无效,则行为为
如果任何参数不是
对应转换规范,行为未定义。
但是,如果我这样写:
unsigned int i = -1;
printf("%d\n", (int)i); // unsigned to signed

这也是不明确的行为吗?

最佳答案

这也是不明确的行为吗?
不。参数的类型正确它需要一个有符号整数,而您提供了一个唯一需要注意的是,结果是实现定义的(不是未定义的)。
6.3.1.3 Signed and unsigned integers - p3
否则,将对新类型进行签名,并且不能表示该值
在它中;结果要么是实现定义的,要么是
产生实现定义的信号。
所以它要么会打印一些东西(因为转换发生了),要么会发出一些信号。无论发生什么,您的实现都需要通过记录来让您知道。

关于c - unsigned int的“printf(”%d\n”,(int)a);”行为是否未定义? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47767253/

10-11 15:32
查看更多