【问题标题】:What would be the expression, true or false表达方式是什么,真或假
【发布时间】:2015-08-31 12:10:24
【问题描述】:
uint8_t ui8 = 255;
ui8 == (int16_t)-1

据我了解standard

否则,如果有符号整数类型的操作数的类型可以表示无符号整数类型的操作数的所有值,则将无符号整数类型的操作数转换为有符号整数类型的操作数的类型输入。

ui8 将被转换/提升为 int16_t,然后它的算术值将是 -1。不幸的是,我使用的编译器说我不对。

【问题讨论】:

  • 如果您将uint8 转换为int16,则值 255 为 255。

标签: c


【解决方案1】:

每当uint8_t 或任何其他小整数类型用作表达式的一部分时,它都会被提升为类型int 的整数。 int16_t 也是如此,以防 int 大于 16 位。

所以你的代码保证等于:

(int)255 == (int)-1

这总是错误的。

由于整数提升,两个操作数已经属于同一类型,因此操作数之间不会发生平衡。

【讨论】:

    【解决方案2】:

    变量ui8,其值为255,将被转换为int类型以进行比较,它仍然具有255的值。

    (int16_t)-1 也将转换为类型int,它仍然具有值-1

    255-1 相比是 false

    【讨论】:

    • 这过于简单化了。如果 int 在特定机器上是 16 位,那么是的,ui8 将被转换为 int16_t。但是因为整数提升,而不是因为操作数之间的平衡,正如您的回答所暗示的那样。如果 int 是 32 位,你的答案是不正确的。
    • @Lundin:逻辑可能不正确,但结论不正确,并且出于合理的原因。两个值(-1 和 255)都在提升类型的范围内。
    • @MSalters 我只是想澄清uint8_t 操作数的提升不依赖于int16_t 操作数的类型。许多 C 程序员对隐式类型提升规则感到困惑。反正现在发帖人已经更正了答案,所以一切都很好。
    【解决方案3】:

    ui8 将被转换/提升为 int16_t,然后它的算术值为 -1。

    是的,ui8 的类型将被转换/提升。(正如 Lundin Sir !! 在评论中提到的那样)这是因为 integer promotion 因此 ui8 将被提升为类型 int16_t 以防int16 bit,但如果在您的机器上int 大于16 bit,那么两者都将提升为int

    根据您对标准的引用,它说的是类型而不是值。所以ui8 将保留其价值,即255

    因此 -

      ui8==(int16_t)-1 // may be (int)u8==(int)-1 depends on size of int on you machine
    

    结果为@​​987654333@。

    【讨论】:

    • 这过于简单化了。如果特定机器上的 int 是 16 位,那么是的,ui8 将被转换为 int16_t。但是因为整数提升,而不是因为操作数之间的平衡,正如您的回答所暗示的那样。如果 int 是 32 位,你的答案是不正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 2014-09-07
    • 2015-12-05
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    相关资源
    最近更新 更多