Упрямый бит не будет установлен в один. - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть этот код, который я использую для получения мантиссы или значения двоичного числа IEEE.

iFloat_t floatGetVal (iFloat_t x) {
  iFloat_t mantissa = (BITS == 16) ? (x & 0x03FF)
                      : (x & 0x007FFFFF);
    debug("%s: getVal before implicit 1", getBinary(mantissa));
    //mantissa = (BITS == 16) ? (mantissa | 0x04)
    //                : (mantissa | 0x008);
    mantissa = x | 0000010000000000;
    debug("%s: getVal after implicit 1", getBinary(mantissa));
    mantissa = (BITS == 16) ? (mantissa & 0x07FF)
                      : (mantissa & 0x00FFFFFF);
    if(floatGetSign(x) == 1) {
        mantissa = ~mantissa + 1;
    }
    return mantissa;
}

Моя проблема, когда я пытаюсь получить значение из числа 63.125, вот соответствующий вывод:

DEBUG iFloat.c[31] floatGetVal() 0000-0011-1110-0100: getVal before implicit 1
DEBUG iFloat.c[35] floatGetVal() 0101-0011-1110-0100: getVal after implicit 1
DEBUG iFloat.c[81] floatAdd() 0000-0011-1110-0100: bits of val_y after assignment

Это мой ожидаемый результат:

DEBUG iFloat.c[31] floatGetVal() 0000-0011-1110-0100: getVal before implicit 1
DEBUG iFloat.c[35] floatGetVal() 0101-0111-1110-0100: getVal after implicit 1
DEBUG iFloat.c[81] floatAdd() 0000-0111-1110-0100: bits of val_y after assignment

Вот мой полный код:

https://pastebin.com/w4UVzmUe

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

В стандартном С. нет двоичных констант, поэтому вы не можете иметь что-то вроде 0b0000010000000000. Но у GCC есть расширение для поддержки их с префиксами 0b или 0B.

Если вы не используете GCC, лучше воспользуйтесь предложением @ zch.

0 голосов
/ 10 сентября 2018

0000010000000000 является восьмеричным, а не двоичным литералом, используйте шестнадцатеричный 0x0400.

...