Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
ACTIONFENIX
3 / 3 / 2
Регистрация: 21.02.2015
Сообщений: 74
Завершенные тесты: 1
#1

Неверный вывод байтов int-а при приведении его до char* - C++

02.02.2017, 17:56. Просмотров 230. Ответов 8
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
template<typename T>
void print_bytes(T val)
{
    for (size_t i = 0; i < sizeof(val) * 8; ++i)
    {
        cout << !!(val & (1 << (sizeof(val) * 8 - i - 1)));
        if ((i + 1) % 8 == 0)
        {
            cout << " ";
        }
    }
    cout << endl;
}
 
int main()
{
    int a = 25000;
    char *ptr = (char*)&a;
    cout << ptr << endl;
    print_bytes(*ptr); //дичь
    print_bytes(*(ptr + 1)); //дичь
    print_bytes(*(ptr + 2)); //дичь
    print_bytes(*(ptr + 3)); //дичь
    print_bytes(a); //вот тут правильный вывод
    return 0;
}
При представлении числа как символьного массива байты выводит в обратном порядке. Почему так?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2017, 17:56
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Неверный вывод байтов int-а при приведении его до char* (C++):

Реализация функции char *padl(const char *string, int len, int c=' ')
Реализовать функцию возвращающую указатель на новую строку длины len,...

Как превести из char* в int и наоборот из int в char*?
Как превести из char* aa='123' в int aa=123 и наоборот из int в char* ....

Форматирование строк, char to int & int to char
Покажите как запихнуть число в строку и вытащить его обратно из строки. Вот...

Неверный результат при преобразования типов данных static_cast<int>(double)
Доброго времени суток, уважаемые программисты! Перейду сразу к сути проблемы:...

Не выходит преобразование матрицы типа int в char и вывод строк массива
Если указываю массив например 5 на 5, то то всё отлично преобразует, но в...

Подскажите пожалуйста с int main(int argc, char*argv[])
Если я правильно понимаю, то int argc это передача аргумента программе, т. е...

8
MrGluck
Модератор
Эксперт CЭксперт С++
7980 / 4861 / 1422
Регистрация: 29.11.2010
Сообщений: 13,234
02.02.2017, 17:58 #2
Использование std::bitset запрещено?
0
Croessmah
++Ͻ
14146 / 8071 / 1512
Регистрация: 27.09.2012
Сообщений: 19,905
Записей в блоге: 3
Завершенные тесты: 1
02.02.2017, 18:00 #3
Лучший ответ Сообщение было отмечено ACTIONFENIX как решение

Решение

Цитата Сообщение от ACTIONFENIX Посмотреть сообщение
Почему так?
Порядок байтов
1
ACTIONFENIX
3 / 3 / 2
Регистрация: 21.02.2015
Сообщений: 74
Завершенные тесты: 1
02.02.2017, 18:20  [ТС] #4
MrGluck, MrGluck, суть не в этом. Мне нужно было получить такое представление числа, которое используется в двоичных файлах.

Добавлено через 8 минут
Croessmah, все же это не обьясняет, почему одно и то же число выводится с разным порядком следования байтов. Я не использую ни сеть, ничего такого.
0
Evg
Эксперт CАвтор FAQ
18937 / 6898 / 512
Регистрация: 30.03.2009
Сообщений: 19,432
Записей в блоге: 30
02.02.2017, 21:17 #5
Цитата Сообщение от ACTIONFENIX Посмотреть сообщение
Croessmah, все же это не обьясняет, почему одно и то же число выводится с разным порядком следования байтов. Я не использую ни сеть, ничего такого
Сеть тут не при чём. Число хранится в памяти в четырёх байтах. На intele'е оно хранится в little-endian. Если ты этот же исходник скомпилишь на sparc'е (big-endian машина), то обе печати совпадут
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4371 / 2346 / 654
Регистрация: 18.10.2014
Сообщений: 3,996
02.02.2017, 21:31 #6
Цитата Сообщение от ACTIONFENIX Посмотреть сообщение
байты выводит в обратном порядке
Наборот, это мы привыкли по жизни писать числа "в обратном порядке", то есть вес разряда в нашей повседневной записи числа в любой позиционной системе счисления возрастает справа-налево (!). И это при том, что читать и писать мы привыкли слева-направо. Кстати, именно по этой причине вы сами в вашу же функцию печати значения val запрограммировали "переворачивание" вывода: cout << !!(val & (1 << (sizeof(val) * 8 - i - 1)));

А программа ваша как раз таки все выводит байты представления числа во вполне естественном порядке: байты числа в памяти на little-endian машине располагаются в порядке возрастания их значимости. Чем выше адрес байта - тем выше значимость байта. Это вполне естестаенный и логичный порядок байтов. Именно этот порядок вы и наблюдаете в вашем выводе.
3
avgoor
1007 / 601 / 156
Регистрация: 05.12.2015
Сообщений: 1,686
03.02.2017, 17:50 #7
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Наборот, это мы привыкли по жизни писать числа "в обратном порядке", то есть вес разряда в нашей повседневной записи числа в любой позиционной системе счисления возрастает справа-налево (!). И это при том, что читать и писать мы привыкли слева-направо.
А если вспомнить что цифры называются арабскими и в каком направлении пишут/читают арабы, то все встает на свои места.
0
Croessmah
++Ͻ
14146 / 8071 / 1512
Регистрация: 27.09.2012
Сообщений: 19,905
Записей в блоге: 3
Завершенные тесты: 1
03.02.2017, 18:02 #8
Цитата Сообщение от avgoor Посмотреть сообщение
то все встает на свои места.
Ровно до тех пор, пока не попадется железо с другим порядком.
0
avgoor
1007 / 601 / 156
Регистрация: 05.12.2015
Сообщений: 1,686
03.02.2017, 18:21 #9
Цитата Сообщение от Croessmah Посмотреть сообщение
Ровно до тех пор, пока не попадется железо с другим порядком
Дык это холиварный вопрос - "какой порядок другой, а какой правильный?".
Есть же еще middle-endian. Там вообще с порядком весело.
0
03.02.2017, 18:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2017, 18:21
Привет! Вот еще темы с решениями:

Ошибка: initializing argument 2 of `char* fgets(char*, int, FILE*)
Написать программу, которая считывает текст из файла и выводит на экран...

Сделать преобразование unsigned char в char, а затем типу int
Здраствуйте, есть вопрос: Число представлено двумя полями: типа long для...

конвертирование (char)int (char*)int
Вопрос такой каким образом можно выполнить вот такую операцию: у нас есть: ...

Преобразование 4-х байтов в int
Приветствую, в общем пытаюсь считать 4 байта с файла и собрать их в одно число...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru