是“printf(”%d \ n“,(int)a);” unsigned int的未定义行为?

时间:2017-12-12 07:24:50

标签: c language-lawyer format-specifiers

如果我使用错误的格式说明符:

unsigned int i = -1;
printf("%d\n", i);

调用未定义的行为,因为%u的{​​{1}}格式说明符。

C11标准§7.21.6.1(P9):

  

如果转换规范无效,则行为为   undefined .282)如果任何参数不是正确的类型   相应的转换规范,行为未定义。

但是,如果我这样写:

unsigned

它是否也是未定义的行为?

1 个答案:

答案 0 :(得分:6)

  

它是否也是未定义的行为?

没有。参数的类型正确。它需要一个有符号整数,并提供一个整数。唯一需要注意的是结果是实现定义的(未定义)。

6.3.1.3 Signed and unsigned integers - p3

  

否则,新类型已签名且无法表示该值   在里面;结果是实现定义的还是   实现定义的信号被提出。

因此要么会打印某些东西(因为转换发生了),要么会产生一些信号。无论发生什么,您的实施都需要通过记录来通知您。