2011-05-13 95 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)。