Порядок байтов в числе

109
01 ноября 2019, 23:50

Процессор называется Big Endian, если целые числа, занимающие несколько байтов, хранятся по следующему правилу: младший байт записан по наибольшему адресу, и Little Endian, если младший байт хранится по наименьшему адресу; если же порядок записи байтов в составе целого числа не совпадает ни с одним из упомянутых, назовем это Mixed Endian. Определить тип процессора, на котором мы работаем.

Моё неверное решение:

int a = 0xA1B2C3D4; // любое 4-байтное число
char *p = (char*)&a;
if (p < p + 1 && p + 1 < p + 2 && p + 2 < p + 3)
    cout << "Big Endian\n";
else if (p > p + 1 && p + 1 > p + 2 && p + 2 > p + 3)
    cout << "little-endian\n";
else
    cout << "Mixed Endian\n";

Печатает Big Endian, хотя на сомом деле должно быть little (проверял по правильному коду из вики) Почему так?

Answer 1

Ошибок у вас я вижу две: главная в том, что вы сравниваете указатели, а не байты, на которые они указывают. Вторая ошибка а строке

char *p = (char*)&a;

Тип char является знаковым, и поэтому сравнения будут происходить неправильно, так как все байты у вас отрицательные.

А вообще зачем вам такие развесистые условия? Это же можно сделать гораздо проще:

int a = 0xA1B2C3D4; // любое 4-байтное число
unsigned char *p = (unsigned char*)&a;
if (*p == 0xA1)
    cout << "Big Endian\n";
else if (*p == 0xD4)
    cout << "little-endian\n";
else
    cout << "Mixed Endian\n";
Answer 2
#include <iostream>
#include <string>
int main()
{

int a = 0x41424344; // любое 4-байтное число
char *p = (char*)&a;
std::cout << p[0];
std::cout << p[1];
std::cout << p[2];
std::cout << p[3];
std::cout << "\n";
if (p[0] < p[1] && p[1] < p[2] && p[2] < p[3])
    std::cout << "Big Endian\n";
else if (p[0] > p[1] && p[1] > p[2] && p[2] > p[3])
    std::cout << "little-endian\n";
else
    std::cout << "Mixed Endian\n";
}
READ ALSO
Создал TUN адаптер, пишу в него данные wireshark не показывает первые 4 байта

Создал TUN адаптер, пишу в него данные wireshark не показывает первые 4 байта

Данные первые 4 байта теряются в Wireshark Сам код:

138
Реализация окна ввода параметров

Реализация окна ввода параметров

Реализую счётную программу для нескольких алгоритмовВсе параметры вводятся в отдельном окне

152
Как ввести несколько слов на одной строчке. (string)

Как ввести несколько слов на одной строчке. (string)

Здравствуйте! У меня такая проблемаМне нужно, что бы я мог на одной и той же строчке записать (англ слов) - (тире) (рус слово)

151
Выводит не всё заданное в приложение

Выводит не всё заданное в приложение

Приложение на qt начинает работу при нажатии кнопкиСоответственно вся следующая работа происходит в on_pushbutton_clicked()

136