2011-05-13 91 views
0

据我所知,C应该将0xfe转换为-2,所以返回值应该是ceil(x) - 2 - 但函数似乎并不返回那些值。 int m(double x){return 0xfe + ceil(x)}应该返回什么?什么返回0xfe + ceil(x)返回?

对这个新手问题抱歉。一般来说,我不是C程序员。刚学习十六进制和C.

+0

对不起,这个愚蠢的问题 - 我不是一个C程序员,只是学习。 – ina 2011-05-13 05:28:19

回答

7

0xfe-2,它是254

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

+0

如果您将其隐式转换为无符号字符,就像上面提到的那样?有时候会是-2吗? – ina 2011-05-13 05:31:23

+1

@ina:不;一个'unsigned char'永远不会是负面的。如果你将它明确地**转换为'signed char'(或更好的'int8_t'),它可能*变成'-2',但实际结果是实现定义的。 – 2011-05-13 05:34:27

10

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

如果明确转换为int8_t或其他8位有符号的类型,就像这样:

(int8_t)0xfe 

,那么你可以得到值-2,但这不是由标准的保证。这是因为0xfe的值是254,这是不是一个符号的8位字段表示的,所以在标准的第6.3.1.3最后一个规则:

否则,新的类型是有符号和价值不能代表它;结果是实现定义的或实现定义的信号被引发。

如果你想要的值-2,写-2

0

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

0xFE有时可能意味着-2,但这完全取决于存储该值的数据类型。如果只写入0xFE,它将被解释为int,并且表示为254.如果将其存储在一个带符号的字符(一个字节,范围为-128到127的8位)中,它应该被解释为-2。在c/C++中,这个数据类型被称为char,我想C#把它称为字节,但我不确定。

+2

最后一句中的“应该”实际上是实现定义的。正确的C代码不会使用'(signed char)0xfe'。 – 2011-05-13 11:29:35

2

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