2016-03-29 2 views
0

Когда я объявляю переменную как float и вычитаю два шестнадцатеричных числа, я всегда получаю разные ответы каждый раз, когда компилирую и запускаю его. Где, если я объявляю целочисленную переменную, результат остается неизменным каждый раз, когда я компилирую и запускаю код. Я не понимаю, почему результат сохраняется в обращении изменяется каждый раз, я компилировать с разницей тех же двух чисел (0xff0000 - 0xFF7FF)Вычитание гексадецималов

int main() 
{ 
    float BlocksLeft = 0xFF0000 - 0xFF7FF; 
    int BLeft = 0xFF0000 - 0xFF7FF; 

    printf("%08x\n", BlocksLeft); 
    printf("%08x\n", BLeft); 
} 
+0

Я использую этот онлайн компилятор http://www.tutorialspoint.com/compile_c_online.php –

+4

Поплавок не является целым числом без знака , и поэтому '% x' является незаконным спецификатором формата для «BlocksLeft», что приводит к UB. –

+0

Чтобы напечатать 'float' и увидеть все его значение, попробуйте' printf («%. 9e \ n», BlocksLeft), ''% 08x' для целых чисел без знака. – chux

ответ

4

Следующая строка неверна:

printf("%08x\n", BlocksLeft); 

%x формат будет указывать компилятору аргумент, который вы даете, - это int. Это приводит к неопределенному поведению. Я попытался скомпилировать код и я получил:

>gcc -Wall -Wextra -Werror -std=gnu99 -o stackoverflow.exe stackoverflow.c 
stackoverflow.c: In function 'main': 
stackoverflow.c:15:4: error: format '%x' expects argument of type 'unsigned int', but argument 2 has type 'double' [-Werror=format=] 
    printf("%08x\n", BlocksLeft); 
    ^

Пожалуйста, попробуйте скомпилировать с более сильным уровнем предупреждения, по крайней мере -Wall.

Вы можете исправить вашу программу таким способом, например:

#include <stdio.h> 

int main() 
{ 
    float BlocksLeft = 0xFF0000 - 0xFF7FF; 
    int BLeft = 0xFF0000 - 0xFF7FF; 

    printf("%08x\n", (int) BlocksLeft); // Works because BlocksLeft's value is non negative 
    // or 
    printf("%08x\n", (unsigned int) BlocksLeft); 
    // or 
    printf("%.8e\n", BlocksLeft); 

    printf("%08x\n", BLeft); 
} 
+0

Деталь: ''% x "' для 'unsigned'. ''% x "' также работает с неотрицательным 'int'. – chux

+0

@chux Я обожаю детали! Ответ отредактирован. – jdarthenay

+0

Подробнее: ''% x "' для 'unsigned':" ..., x, X Преобразован аргумент 'unsigned int' ..." C11 §7.21.6.1 8 Функция 'fprintf'. ''% x "' также работает с неотрицательным 'int', потому что« один продвинутый тип - это целочисленный тип со знаком, другой продвинутый тип - это соответствующий целочисленный тип без знака, и это значение представляется в обоих типах »; §6.5.2.2 6 Функциональные вызовы '...' – chux