Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 60, средняя оценка - 4.72
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
#1

Порядок байт в big-endian и little-endian - C++

13.06.2013, 11:29. Просмотров 10046. Ответов 32
Метки нет (Все метки)

Всем привет! Народ подскажите мне пожалуйста простые прописные истины, а то я что то запутался!
Предположим что у нас в байте 8 - бит и где число 5 будет иметь вид 101.
Как будет выглядеть число 5 в 2-х байтах памяти в big-endian и little-endian.

0000 0000 0000 0101 - big-endian ?
0000 0101 0000 0000 - little-endian ?
1
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2013, 11:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Порядок байт в big-endian и little-endian (C++):

Как объединить пару байт в слово? (Загрузка WAV, Big Endian) - C++
Привет! Есть звуковой файл с 16-и битными амплитудами. Да не суть. После открытия файла и чтения всяких заголовков, остаются чистые RAW...

Из little endian в big endian - C++
Есть 256-битное 16-ричное число: 54 68 69 73 20 69 73 20 6D 65 73 73 61 67 65 2C 20 6C 65 6E 67 74 68 3D 33 32 20 62 79 74 65 73 Как...

Big-endian тестирование - C++
Есть программа, которая должна работать на little и big endian одинаково. В ней куча всяких "ifdef". С помощью какого ПО для виртуализации...

Как проще всего работать с Big-Endian C++ ? - C++
С++. Как проще всего работать с Big-Endian, используя стандартные операции ?

Перекодировать из UCS-2 Little Endian в UTF - C++
Есть много файлов *.txt в кодировке (как я понял) UCS-2 Little Endian. Как перевести эти файлы в кодировку UTF или ANSI? Пока что делаю это...

Из UCS-2 Little Endian в UTF-8 без BOM - C++
Здравствуйте! Имеется файлик xml в кодировке UCS-2 Little Endian. Хочу написать обработчик на с++ который будет менять кодировку на...

32
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 22:00  [ТС] #16
Цитата Сообщение от Убежденный Посмотреть сообщение
Компилятор может расположить их в памяти так,
как ему вздумается, для контроля над этим нужно вставлять барьер компилятора
Про какой барьер компилятора вы говорите? И как его применять?

Добавлено через 11 минут
Цитата Сообщение от Убежденный Посмотреть сообщение
#include <iostream>
int main()
{
* * int const Value = 0x1234abcd;
* * unsigned char const *pByte = (unsigned char const *)&Value;
for (size_t i = 0; i < sizeof (Value); ++i)
* * {
* * * * std::cout << std::hex << static_cast<int>(pByte[i]);
* * }
std::cout << std::endl;
return 0;
}
То что вы написали это шестнадцатиричный вид значений каждого байта. Да не спорю по результату видно что байты перевернуты. Но я в примерах смотрю на числа через битовую маску, тем самым могу увидеть бинарное представление числа.
В первом случае в функции trigerbyte я не преобразую переменную (которую нужно посмотреть в бинарном виде) к указателю на тип и получаю в результате вид числа (например) 5 таким 0000 0000 0000 0101(значение в short)
вместо 0000 0101 0000 0000. Почему так происходит?
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
14.06.2013, 22:08 #17
Цитата Сообщение от stawerfar Посмотреть сообщение
В первом случае в функции trigerbyte я не преобразую переменную (которую нужно посмотреть в бинарном виде) к указателю на тип и получаю в результате вид числа (например) 5 таким 0000 0000 0000 0101(значение в short)
В этом случае компилятор следит, чтобы младший бит оказался "самым правым", а страший — "самым левым". То есть когда мы говорим про младший разряд или байт какого-то числа или пременной, то это забота компилятора, чтобы они оказались именно младшими. От машинного представления числа это не зависит, мы не спускаемся до машинного представления.

Цитата Сообщение от stawerfar Посмотреть сообщение
я не преобразую переменную (которую нужно посмотреть в бинарном виде) к указателю на тип
Ну а вот когда преобразуешь — сам спускаешься до понятий байт и бит, которых для чисел и переменных с точки зрения языка нет. Значит должен сам учитывать машинное представление. Теперь от него порядок байт зависит напрямую.
1
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 22:24  [ТС] #18
Спасибо!

Добавлено через 1 минуту
А про какие барьеры говорил "Убежденный"?
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
14.06.2013, 22:27 #19
Про барьеры не знаю, но выражение (&sizebyte < &sizebit) действительно бессмысленное.
1
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 22:41  [ТС] #20
Да я согласен нужно было использовать например
C++
1
2
char buff[2];
if (&buff[0] < &buff[1])
Добавлено через 1 минуту
Эта запись должна точно гарантировать то что эти указатели следуют друг за другом
0
Убежденный
Ушел с форума
Эксперт С++
15689 / 7199 / 1138
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
14.06.2013, 22:41 #21
Цитата Сообщение от stawerfar Посмотреть сообщение
Про какой барьер компилятора вы говорите? И как его применять?
Компилятор может в процессе оптимизации сгенерировать такой машинный код, что
он будет лишь очень отдаленно напоминать оригинал: переменные могут быть перемешаны,
помещены в регистры, и т.д. Кое-что вообще будет выкинуто за борт.
В данном примере
Цитата Сообщение от stawerfar Посмотреть сообщение
C++
1
2
int sizebyte = sizeof(val);
int sizebit = sizebyte * 8;
вы не можете быть наверняка уверенным, что переменная sizebyte располагается в
памяти до sizebit, ровно как и наоборот. Точно также нельзя быть уверенным в том,
что присваивание sizebyte выполняется до присваивания sizebit. Например, попробуйте
сделать sizebyte и sizebit глобальными - вполне возможно, что вывод программы будет
другим. Так что этот код некорректен. Для контроля над подобными вещами существуют
барьеры компилятора, в Visual C++, например, это _ReadWriteBarrier и volatile.
Хотя они предназначены в основном для многопоточного кода, а не для таких примеров.
1
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 22:43  [ТС] #22
А смысл был определить нумерацию адресов на данной машине. То есть сначала или с конца идет нумерация адресов в памяти.
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
14.06.2013, 22:44 #23
Цитата Сообщение от stawerfar Посмотреть сообщение
Да я согласен нужно было использовать например
char buff[2];
if (&buff[0] < &buff[1])
А это выражение всегда истинно. Тогда как предыдущее непредсказуемо.
1
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 22:48  [ТС] #24
Цитата Сообщение от grizlik78 Посмотреть сообщение
А это выражение всегда истинно. Тогда как предыдущее непредсказуемо.
? Можно поподробнее?
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
14.06.2013, 22:49 #25
Цитата Сообщение от stawerfar Посмотреть сообщение
То есть сначала или с конца идет нумерация адресов в памяти.
Нумерация всегда идёт с начала, с какой бы стороны это начало не находилось

Добавлено через 1 минуту
Цитата Сообщение от stawerfar Посмотреть сообщение
? Можно поподробнее?
А что подробнее? Элемент массива с индексом 1 всегда имеет адрес больше, чем элемент с индексом 0. Всё.
2
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 22:49  [ТС] #26
А как тогда проверить машинное представление нумерации адресного пространства?
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
14.06.2013, 22:51 #27
А какой от этого толк?
2
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 22:54  [ТС] #28
Это другой вопрос уже?

Добавлено через 2 минуты
Дело не в толке а в самой сути, я думаю что понимание этого и "ощупывание" расширит мой кругозор в computer science.
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
14.06.2013, 23:04 #29
Ну мне просто не очень понятно значение фразы "машинное представление нумерации адресного пространства".
Ну вот, допустим, есть физические адреса, которые выставляются на шине адреса, есть виртуальные адреса, с которыми работает наша программа на C/C++. Что из того, что между этими адресами может не быть ничего общего? Для программы достаточно, что адреса могут принимать только определённые значения и в массивах эти адреса возрастают от элемента к элементу. Что ещё можно узнать изнутри? По-моему ничего. Может я ошибаюсь...
1
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 23:08  [ТС] #30
Я понял нужно мне наверное переходить на изучение какого нибудь ассемблера и книжку про компиляторы почитать.
Что бы такие тонкости хорошо понимать. Всем спасибо.
0
14.06.2013, 23:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2013, 23:08
Привет! Вот еще темы с ответами:

Перегрузка ifstream и ofstream для работы с файлами в little-endian формате? - C++
Всем привет, мне нужно реализовать классы для работы с файлами в little-endian формате. Для этого задумал сделать public-потомки...

Порядок байт в union - C++
#include &lt;iostream&gt; using namespace std; void disp_binary(unsigned u); union swap_bytes { short int num; char ch; ...

Порядок байт в слове и бит в байте - C++
читал эту требуются пояснения. A B C D - адреса в них число 128 BE A B C D ...

Определить порядок хранения байт 16-ричного числа - C++
Всем привет! Имеется следующий вопрос: написать программу, которая показывает порядок хранения байт 16-ричного числа. Как это сделать?


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

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

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