Я пытаюсь получить доступ к отдельным байтам с плавающей запятой и получаю неожиданные результаты.

0

Так что у меня это до сих пор:

#include <iostream>
#include <string>
#include <typeinfo>

using namespace std;

int main ()
{
    float f = 3.45;           // just an example fp#
    char* ptr = (char*)&f;    // a character pointer to the first byte of the fp#?

    cout << int(ptr[0]) << endl; // these lines are just to see if I get what I 
    cout << int(ptr[1]) << endl; // am looking for... I want ints that I can 
    cout << int(ptr[2]) << endl; // otherwise manipulate.
    cout << int(ptr[3]) << endl;
}
the result is:
-51
-52
92
64

так что -51 и -52 не находятся в байтовом диапазоне, который я ожидал бы для char... Я получил информацию из похожих вопросов, чтобы прийти к этому коду и из всех обсуждений, преобразование из char в int простое, Итак, почему отрицательные значения? Я пытаюсь посмотреть четырехбайтовое число, поэтому я бы ожидал 4 целых числа, каждый в диапазоне 0-255.

Я использую Codeblocks 13.12 с gcc 4.8.1 с опцией -std = С++ 11 на устройстве Windows 8.1.

EDIT: Таким образом, решение должно было использовать:

unsigned char* ptr = reinterpret_cast<unsigned char*>( &f );

Спасибо за все ответы.

  • 3
    См. Stackoverflow.com/questions/2054939/… .
  • 0
    Отлично, спасибо @RetoKoradi. Я изменил код на unsigned char * ptr ... и т. Д. Я должен был добавить -fpermissive, чтобы получить его для компиляции, но теперь результаты 205, 204, 92, 64, что выглядит хорошо. Еще раз спасибо!
Показать ещё 8 комментариев
Теги:
floating-point

1 ответ

6
Лучший ответ

Используйте unsigned char для получения (гарантированных) значений без знака.

Вы получаете отрицательные значения, потому что с параметрами вашего компилятора и компилятора (да, это важно) char является подписанным типом.


Кстати, оператор prefix + является удобным и сжатым способом продвижения char для int с целью отображения числового значения.


Также, кстати, это вообще хорошая идея использовать C++ именованные слепки (reinterpret_cast, const_cast, static_cast и dynamic_cast) вместо стиля C бросает, где указатели обеспокоены. Это потому, что приведение стиля C может привести к неожиданностям, особенно когда код поддерживается и типы изменены. В этом случае вы выражаете reinterpret_cast, так что тот, который нужно использовать, - только ради хорошей привычки.

  • 0
    Спасибо. По какой-то причине мне не пришло в голову подписанное лицо, но как только мне это предложили, я смог исправить код. Я также реализовал ваше предложение использовать приведения C ++, а не C-стиль. Теперь все работает как положено.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню