Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
3 / 3 / 2
Регистрация: 21.02.2015
Сообщений: 77
1

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

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

Author24 — интернет-сервис помощи студентам
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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.02.2017, 17:56
Ответы с готовыми решениями:

Входная строка имела неверный формат при приведении к типу Double
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

При явном приведении к int получаются числа, но явно не те, что должны быть
Привет. Есть массив unsigned char. В него записываются данные с устройства с помощью библиотеки...

Ошибка: cannot convert 'int (*)[50]' to 'int*' for argument '1' to 'void vvod2m(int*, int*, int*, char)'Х2
Матрицы An1*m1 и Bn2*m2 вводить с клавиатуры (размерности &gt;3, m1=n2). Выполнять через подпрограммы....

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

8
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
02.02.2017, 17:58 2
Использование std::bitset запрещено?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
02.02.2017, 18:00 3
Лучший ответ Сообщение было отмечено ACTIONFENIX как решение

Решение

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

Добавлено через 8 минут
Croessmah, все же это не обьясняет, почему одно и то же число выводится с разным порядком следования байтов. Я не использую ни сеть, ничего такого.
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.02.2017, 21:17 5
Цитата Сообщение от ACTIONFENIX Посмотреть сообщение
Croessmah, все же это не обьясняет, почему одно и то же число выводится с разным порядком следования байтов. Я не использую ни сеть, ничего такого
Сеть тут не при чём. Число хранится в памяти в четырёх байтах. На intele'е оно хранится в little-endian. Если ты этот же исходник скомпилишь на sparc'е (big-endian машина), то обе печати совпадут
0
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,076
02.02.2017, 21:31 6
Цитата Сообщение от ACTIONFENIX Посмотреть сообщение
байты выводит в обратном порядке
Наборот, это мы привыкли по жизни писать числа "в обратном порядке", то есть вес разряда в нашей повседневной записи числа в любой позиционной системе счисления возрастает справа-налево (!). И это при том, что читать и писать мы привыкли слева-направо. Кстати, именно по этой причине вы сами в вашу же функцию печати значения val запрограммировали "переворачивание" вывода: cout << !!(val & (1 << (sizeof(val) * 8 - i - 1)));

А программа ваша как раз таки все выводит байты представления числа во вполне естественном порядке: байты числа в памяти на little-endian машине располагаются в порядке возрастания их значимости. Чем выше адрес байта - тем выше значимость байта. Это вполне естестаенный и логичный порядок байтов. Именно этот порядок вы и наблюдаете в вашем выводе.
3
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
03.02.2017, 17:50 7
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Наборот, это мы привыкли по жизни писать числа "в обратном порядке", то есть вес разряда в нашей повседневной записи числа в любой позиционной системе счисления возрастает справа-налево (!). И это при том, что читать и писать мы привыкли слева-направо.
А если вспомнить что цифры называются арабскими и в каком направлении пишут/читают арабы, то все встает на свои места.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
03.02.2017, 18:02 8
Цитата Сообщение от avgoor Посмотреть сообщение
то все встает на свои места.
Ровно до тех пор, пока не попадется железо с другим порядком.
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
03.02.2017, 18:21 9
Цитата Сообщение от Croessmah Посмотреть сообщение
Ровно до тех пор, пока не попадется железо с другим порядком
Дык это холиварный вопрос - "какой порядок другой, а какой правильный?".
Есть же еще middle-endian. Там вообще с порядком весело.
0
03.02.2017, 18:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2017, 18:21
Помогаю со студенческими работами здесь

Error C2040:strnset_2:"char *(char *,int,unsigned int)" отличается по уровням косвенного обращения от "int ()"
Не могу найти в чём ошибка. error C2040: strnset_2: &quot;char *(char *,int,unsigned int)&quot; отличается...

как осуществить приведение типов....(int) char ; (char) int;
Подскажите пожалуйста. мне нужно перевести программу с билдера на дельфи. Есть некоторые нюансы. ...

Вывод адреса для типов int* и char*
Здравствуйте, Подскажите пожалуйста, что то я запутался с оператором new: int*...

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru