【问题标题】:What does return 0xfe + ceil(x) return?return 0xfe + ceil(x) 返回什么?
【发布时间】:2011-05-13 04:50:22
【问题描述】:

据我了解,C 应该将 0xfe 转换为 -2,因此返回应该是 ceil(x) - 2 - 但该函数似乎不返回任何一个。 int m(double x){return 0xfe + ceil(x)} 应该返回什么?

为这个新手问题道歉。我一般不是 C 程序员。刚刚学习 hex 和 C。

【问题讨论】:

  • 抱歉这个愚蠢的问题 - 我不是 C 程序员,只是在学习。

标签: c# c++ c hex ceil


【解决方案1】:

在 C 语言中,0xfe 是十六进制的 int 文字。具体来说,它等于254,所以结果是双精度值ceil(x) + 254.0

如果您显式转换为int8_t 或其他 8 位有符号类型,如下所示:

(int8_t)0xfe

那么你可能得到 -2 的值,但这不是标准所保证的。这是因为0xfe 的值是 254,它不能在有符号的 8 位字段中表示,因此适用标准第 6.3.1.3 节中的最后一条规则:

否则,新类型是有符号的,值不能在其中表示;结果要么是实现定义的,要么引发实现定义的信号。

如果您想要-2 的值,请写-2

【讨论】:

    【解决方案2】:

    0xfe不是-2,是254

    如果您想要-2,请使用“-2”(如果您真的想使用十六进制,请使用“-0x02”)。

    【讨论】:

    • 如果你像上面提到的帖子那样将它隐式转换为无符号字符怎么办?有时会是 -2 吗?
    • @ina:不; unsigned char 永远不会是负面的。如果您将其显式转换为signed char(或更好的int8_t),它将可能变为-2,但实际结果是实现定义的。
    【解决方案3】:

    在 C 中,0xfe 从不 表示 -2。另一方面,-2有时可以表示 0xfe(如果隐式或显式转换为 unsigned char)。

    【讨论】:

      【解决方案4】:

      就像其他答案所说,如果你想要 -2,你应该使用 -2。

      0xfe 有时可以表示 -2 是正确的,但这完全取决于存储值的数据类型。如果只写 0xfe,它将被解释为 int,表示 254。如果将其存储在一个有符号字符(一个字节,8 位,范围为 -128 到 127),它应该被解释为 -2。在 c/c++ 中这种数据类型称为 char,我认为 C# 称它为字节,但我不确定。

      【讨论】:

      • 最后一句中的“应该”实际上是实现定义的。正确的 C 代码不会使用(signed char)0xfe
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      • 2018-06-26
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      相关资源
      最近更新 更多