Pergunta

Estou indo embora um curso de sistema de computadores e estou tentando estabelecer, com certeza, se meu computador baseado em AMD é uma pequena máquina Endian? Eu acredito que é porque seria compatível com a Intel.

Especificamente, meu processador é um AMD 64 ATHLON X2.

Eu entendo que isso pode importar na programação C. Estou escrevendo programas C e um método que estou usando seria afetado por isso. Estou tentando descobrir se obtiveria os mesmos resultados se eu executasse o programa em uma máquina baseada em Intel (assumindo que é Little Endian Machine).

Por fim, deixe -me perguntar o seguinte: toda e qualquer máquinas capazes de executar o Windows (XP, Vista, 2000, Server 2003, etc) e, digamos, Desktop do Ubuntu Linux ser pequeno endian?

Obrigada,
Frank

Foi útil?

Solução

Todas as máquinas x86 e x86-64 (que é apenas uma extensão para x86) são pouco endianas.

Você pode confirmar com algo assim:

#include <stdio.h>
int main() {
    int a = 0x12345678;
    unsigned char *c = (unsigned char*)(&a);
    if (*c == 0x78) {
       printf("little-endian\n");
    } else {
       printf("big-endian\n");
    }
    return 0;
}

Outras dicas

Uma maneira fácil de saber que o Endiannes está listado no artigo Escrevendo Código Independente Endiano em C

const int i = 1;
#define is_bigendian() ( (*(char*)&i) == 0 )

Supondo que você tenha instalado o Python, você pode executar essa linha, que imprimirá "Little" em máquinas pequenas e muito endianas e "Big" em Big-Endian:

python -c "import struct; print 'little' if ord(struct.pack('L', 1)[0]) else 'big'"

"Intel compatível" não é muito preciso.

A Intel costumava fazer processadores grandes endianos, principalmente o StrongArm e o XSCale. Estes não usam o IA32 ISA, comumente conhecido como x86.

Mais adiante na história, a Intel também tornou os pequenos endianos i860 e i960, que também não são compatíveis com x86.

Mais adiante na história, os precessores do x86 (8080, 8008, etc.) também não são compatíveis com x86. Sendo processadores de 8 bits, Endianness não importa ...

Atualmente, a Intel ainda faz o Itanium (IA64), que é bi-endiano: a operação normal é big-endian, mas o processador também pode ser executado no modo Little-Endian. Acontece que é capaz de executar o código X86 no modo Little-Endian, mas o ISA nativo não é IA32.

Que eu saiba, todos os processadores da AMD foram compatíveis com x86, com algumas extensões como x86_64, e, portanto, são necessariamente pequenos endianos.

O Ubuntu está disponível para X86 (Little-Endian) e X86_64 (Little-Endian), com portas menos completas para IA64 (Big-Endian), Arm (El) (Little-Endian), Pa-Risc (Big-Endian, embora o O processador suporta ambos), PowerPC (Big-Endian) e SPARC (Big-Endian). Não acredito que haja um porto de braço (EB) (Big-Endian).

Em resposta à sua pergunta final, a resposta é não. O Linux é capaz de executar em máquinas grandes Endianas, como o EG, o PowerMacs da geração mais antiga.

Você precisa baixar uma versão do Ubuntu projetada para grandes máquinas Endianas. Eu sei apenas do PowerPC versões. Tenho certeza de que você pode encontrar um lugar que tenha uma implementação Big-Endian mais genérica.

/* by Linas Samusas  */

#ifndef _bitorder 
#define _bitorder 0x0008

#if (_bitorder > 8)
#define BE
#else
#define LE
#endif

e use isso

#ifdef LE
#define Function_Convert_to_be_16(value)  real_function_to_be_16(value)
#define Function_Convert_to_be_32(value)  real_function_to_be_32(value)
#define Function_Convert_to_be_64(value)  real_function_to_be_64(value)
#else
#define Function_Convert_to_be_16
#define Function_Convert_to_be_32
#define Function_Convert_to_be_64
#endif

se le

unsigned long number1 = Function_Convert_to_be_16(number2);

*Macro chamará a função real e se converterá para ser

se for

unsigned long number1 = Function_Convert_to_be_16(number2);

*Macro será definido como palavra não uma função e seu número será entre colchetes

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top