【发布时间】: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 应该将 0xfe 转换为 -2,因此返回应该是 ceil(x) - 2 - 但该函数似乎不返回任何一个。 int m(double x){return 0xfe + ceil(x)} 应该返回什么?
为这个新手问题道歉。我一般不是 C 程序员。刚刚学习 hex 和 C。
【问题讨论】:
在 C 语言中,0xfe 是十六进制的 int 文字。具体来说,它等于254,所以结果是双精度值ceil(x) + 254.0。
如果您显式转换为int8_t 或其他 8 位有符号类型,如下所示:
(int8_t)0xfe
那么你可能得到 -2 的值,但这不是标准所保证的。这是因为0xfe 的值是 254,它不能在有符号的 8 位字段中表示,因此适用标准第 6.3.1.3 节中的最后一条规则:
否则,新类型是有符号的,值不能在其中表示;结果要么是实现定义的,要么引发实现定义的信号。
如果您想要-2 的值,请写-2。
【讨论】:
0xfe不是-2,是254。
如果您想要-2,请使用“-2”(如果您真的想使用十六进制,请使用“-0x02”)。
【讨论】:
unsigned char 永远不会是负面的。如果您将其显式转换为signed char(或更好的int8_t),它将可能变为-2,但实际结果是实现定义的。
在 C 中,0xfe 从不 表示 -2。另一方面,-2有时可以表示 0xfe(如果隐式或显式转换为 unsigned char)。
【讨论】:
就像其他答案所说,如果你想要 -2,你应该使用 -2。
0xfe 有时可以表示 -2 是正确的,但这完全取决于存储值的数据类型。如果只写 0xfe,它将被解释为 int,表示 254。如果将其存储在一个有符号字符(一个字节,8 位,范围为 -128 到 127),它应该被解释为 -2。在 c/c++ 中这种数据类型称为 char,我认为 C# 称它为字节,但我不确定。
【讨论】:
(signed char)0xfe。