2010-08-26 4 views
3

Я слышал в little endian, LSB находится на начальном адресе, а в Big endian MSB находится на начальном адресе. Я написал свой код следующим образом. Если не так?Этот код проверяет подлинность?

void checkEndianess() 
{ 

int i = 1; 
char c = (char)i; 

if(c) 
     cout<<"Little Endian"<<endl; 
else 
    cout<<"Big Endian"<<endl; 


} 
+1

Нет, это не так. – dreamlax

+1

Игнорируйте все эти уродливые решения, будьте сексуальны: 'int i = 1; if (reinterpret_cast (i)) {/ * little * /} '. – GManNickG

+1

@GMan: 'if (reinterpret_cast ((int const &) 1))' работает на GCC ... – Potatoswatter

ответ

11

Нет, вы принимаете Int и приведения его к полукоксу, который является понятием высокого уровня (и внутри, скорее всего, будет сделан в регистрах). Это не имеет ничего общего с контентой, которая представляет собой концепцию, которая в основном относится к памяти.

Вы, вероятно, ищете это:

int i = 1; 
char c = *(char *) &i; 

if (c) { 
    cout << "Little endian" << endl; 
} else { 
    cout << "Big endian" << endl; 
} 
+0

Большое спасибо. Могу ли вы объяснить, что означает здесь понятие «высокий уровень». Я поступаю так же. Я получу первое значение байта int, когда я передам его правильному символу? – mousey

+0

Концепция высокого уровня означает, что литье является частью языка C/C++ и четко определено в стандартах, и поэтому результат предсказуем на всех возможных платформах, на которых вы запускаете свой код. Endianness - это свойство вашего процессора, т. Е. Это часть языка ассемблера. Поскольку это зависит от платформы, это то, что C/C++ пытается скрыть от вас, поэтому вам не нужно писать код, специфичный для платформы. Записывая в память, а затем читая ее (используя указатели), вы делаете что-то гораздо ближе к аппаратным средствам и, как таковое, можете проверить подлинность. – EboMike

+0

'char' и' int' являются интегральными типами. Приведение из 'int' в' char' сужает тип, но имеет четко определенное значение, которое пытается сохранить значения 'int', которые попадают в' char'. Таким образом '(char) 42' все еще имеет значение 42 ... – RBerteig

1

Попробуйте вместо этого:

int i = 1; 
if (*(char *)&i) 
    little endian 
else 
    big endian 
2

An (возможно, конечно ;-p) чистого способ получить различные интерпретации одного и того же памяти следует использовать союз:

 
#include <iostream> 

int main() 
{ 
    union 
    { 
     int i; 
     char c; 
    } x; 
    x.i = 1; 
    std::cout << (int)x.c << '\n'; 
} 

Кстати или есть больше вариантов консистенции, чем просто большие и маленькие. :-)

Смежные вопросы