Вопрос по c – Отображение переменной с плавающей запятой в виде шестнадцатеричного целого числа облажает соседнее целое число

0

У меня есть эта простая программа

<code>#include <stdio.h>
int main(void)
{
 unsigned int a = 0x120;
 float b = 1.2;
 printf("%X %X\n", b, a);
 return 0;
}
</code>

Я ожидал, что результат будет

<code>some-value 120  (some-value will depend on the bit pattern of `float b` )
</code>

А я вижу

<code>40000000 3FF33333
</code>

Почему ценностьa облажаться?%X рассматривает свои аргументы какsigned int и, следовательно, он должен был извлечь 4 байта из стека и распечатать значениеb и затем, извлекая следующие 4 байта, выведите значениеa который0x120

Не вритеprintf() и тому подобное. Когда-либо. Если вы обещаете датьintдай емуint илиshort илиchar, Если вы обещаете дать емуlongдай емуlong, То же самое дляlong long, Если вы обещаете дать ему значение с плавающей запятой, дайте емуfloat илиdouble, Если вы обещаете ему длинное значение с плавающей запятой, дайте емуlong double. Alexey Frunze

Ваш Ответ

2   ответа
2

используйте объединение:

 float b = 1.2;
 union {
      float  f;
      int    i;
 } u;
 u.f = b;

 printf ("%x\n", u.i);

результаты (32-битная x86):

3f99999a
8

printf не соответствует спецификациям формата.

Во-вторых,float повышен доdouble когда прошлоprintfтак что это восемь байтов вместо четырех. Какие байты интерпретируются как дваunsigned ожидаемые значенияprintf Формат зависит от порядка, в котором передаются аргументы.

Почему автоматическое продвижение удваивается, когда я четко определил егоfloat? Pavan Manjunath
@Stacker: как поплавки работают в C.float противdouble это только декларация хранения. Значения с плавающей запятой «всегда» обрабатывается как двойники в вычислениях.
@wallyk: float не всегда обрабатываются как double в вычислениях. Тем не менее, ониare всегда повышается до удваивается при передаче в качестве аргументов функции varargs (это один изdefault argument promotions)
@Stacker: да, это неопределенное поведение; что на самом деле произойдет, будет зависеть от соглашений о передаче параметров целевой платформы, и выwill увидеть разное поведение на разных платформах.
@Stacker Вот как работают varargs. Типы с плавающей точкой меньше чемdouble получить повышение вdouble, Целочисленные типы меньше чемint получить повышение вint.

Похожие вопросы