【问题标题】:Is "printf("%d\n",(int)a);" undefined behaviour for unsigned int? [duplicate]是 "printf("%d\n",(int)a);" unsigned int 的未定义行为? [复制]
【发布时间】:2017-12-12 07:24:50
【问题描述】:

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

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

它被调用未定义的行为,因为%uunsigned 的格式说明符。

C11 标准§ 7.21.6.1(P9):

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

但是,如果我这样写:

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

这也是未定义的行为吗?

【问题讨论】:

  • 你可能错过了一些 language-lawyer 标签
  • 一个有符号整数总是可以被解释为一个无符号整数,除非你有一些带有补码和陷阱表示的奇异废话系统。
  • 重新打开 - 链接的问题是关于已签名到未签名的,而这是关于未签名到已签名的,这是不同的。 (这有一个很好的答案)

标签: c language-lawyer format-specifiers


【解决方案1】:

这也是未定义的行为吗?

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

6.3.1.3 Signed and unsigned integers - p3

否则,新类型有符号,值无法表示 在里面;结果是实现定义的或 引发了实现定义的信号。

所以它要么打印 something(因为发生了转换),要么会发出一些信号。无论发生什么,您的实现都需要通过记录它来让您知道。

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    相关资源
    最近更新 更多