Intereting Posts
hscurses или ncurses, какой из них использовать? установка новой независимой переменной меняет все остальные переменные в c что заставляет системные вызовы в linux работать при повышенных разрешениях Элемент доступа в вложенной структуре в C Преобразуйте действительно большое число из двоичного в десятичное и напечатайте его sublime text 2 build system для языка программирования C Почему адрес статических переменных относительно указателя инструкций? Использование «статического» в структуре в C Объединить два массива int из одного массива без дублирования Как malloc внутри функции и вернуть указатель в C? Что означает psz в pszBuffer или аналогичном? почему мы не можем неявно назначать из void * любому другому типу в C ++, но его предпочтительнее в C? Является ли это подходящим использованием спецификаторов const в C? Что означает эта инструкция сборки? sprintf () без конечного нулевого пространства в C

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

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

#include  int main(void) { unsigned int a = 0x120; float b = 1.2; printf("%X %X\n", b, a); return 0; } 

Я ожидал, что выход будет

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

А я вижу

 40000000 3FF33333 

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

    Во-первых, это неопределенное поведение для передачи аргументов printf не соответствующих спецификаторам формата.

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

    Если вы хотите увидеть бит хранимого поплавка, используйте объединение:

      float b = 1.2; union { float f; int i; } u; uf = b; printf ("%x\n", ui); 

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

     3f99999a