Что возвращает 0xfe + ceil (x)? - PullRequest
0 голосов
/ 13 мая 2011

Как я понимаю, C должен конвертировать 0xfe в -2, поэтому возвращаемое значение должно быть ceil (x) - 2 - но функция, похоже, не возвращает ни того, ни другого.Что должен int m(double x){return 0xfe + ceil(x)} вернуть?

Извинения за этот вопрос новичка.Я вообще не программист на Си.Просто узнаю о гексе и C.

Ответы [ 4 ]

10 голосов
/ 13 мая 2011

На языке C 0xfe - это шестнадцатеричный int литерал.В частности, оно равно 254, поэтому результатом является значение двойной точности ceil(x) + 254.0.

Если вы явно преобразуете в int8_t или другой 8-битный тип со знакомПримерно так:

(int8_t)0xfe

тогда вы можете получить значение -2, но это не гарантируется стандартом.Это связано с тем, что 0xfe имеет значение 254, которое не может быть представлено в 8-битном поле со знаком, поэтому применяется последнее правило в разделе 6.3.1.3 стандарта:

В противном случае новыйтип подписан и значение не может быть представлено в нем;либо результат определяется реализацией, либо генерируется определяемый реализацией сигнал.

Если вам нужно значение -2, напишите -2.

7 голосов
/ 13 мая 2011

0xfe это не -2, это 254.

Если вы хотите -2, используйте "-2" (или "-0x02"если вы действительно хотите использовать hex).

2 голосов
/ 13 мая 2011

В C 0xfe никогда означает -2.С другой стороны, -2 может иногда означать 0xfe (если преобразовано, неявно или явно, в unsigned char).

0 голосов
/ 13 мая 2011

Как и в других ответах, если вы хотите -2, вы должны использовать -2.

Правильно, что 0xfe иногда может означать -2, но это полностью зависит от типа данных, в котором хранится значение. Если вы только напишите 0xfe, оно будет интерпретировано как int и будет означать 254. Если вы сохраните его в знаковый символ (байт, 8 битов в диапазоне от -128 до 127), его следует интерпретировать как -2. В c / c ++ этот тип данных называется char , я думаю, что C # называет его байтом, но я не уверен.

...