Процессор называется 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 (проверял по правильному коду из вики) Почему так?
Ошибок у вас я вижу две: главная в том, что вы сравниваете указатели, а не байты, на которые они указывают. Вторая ошибка а строке
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";
#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";
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Данные первые 4 байта теряются в Wireshark Сам код:
Реализую счётную программу для нескольких алгоритмовВсе параметры вводятся в отдельном окне
Здравствуйте! У меня такая проблемаМне нужно, что бы я мог на одной и той же строчке записать (англ слов) - (тире) (рус слово)
Приложение на qt начинает работу при нажатии кнопкиСоответственно вся следующая работа происходит в on_pushbutton_clicked()