내 AMD 기반 기계는 리틀 엔디안 또는 빅 엔디안을 사용합니까?
저는 컴퓨터 시스템 과정을 밟고 있는데, 제 AMD 기반 컴퓨터가 리틀 엔디언 컴퓨터인지 확실히 확인하려고 합니다.인텔과 호환되기 때문이라고 생각합니다.
특히, 제 프로세서는 AMD 64 Athlon x2입니다.
저는 이것이 C 프로그래밍에서 중요할 수 있다는 것을 이해합니다.저는 C 프로그램을 작성하고 있는데 제가 사용하는 방법도 영향을 받을 것입니다.인텔 기반 기계에서 프로그램을 실행해도 같은 결과를 얻을 수 있는지 알아보고 있습니다(작은 엔디안 기계라고 가정합니다).
마지막으로, 이것을 묻겠습니다.Windows(XP, Vista, 2000, Server 2003 등) 및 Ubuntu Linux 데스크톱을 실행할 수 있는 모든 컴퓨터가 거의 엔디언이 아닐까요?
모든 x86 및 x86-64 시스템(x86의 확장일 뿐)은 리틀 엔디언입니다.
다음과 같은 방법으로 확인할 수 있습니다.
#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;
}
엔디안을 쉽게 알 수 있는 방법은 C의 엔디안 독립 코드 작성 문서에 나와 있습니다.
const int i = 1;
#define is_bigendian() ( (*(char*)&i) == 0 )
Python이 설치되어 있다고 가정하면 다음과 같은 하나의 라이너를 실행할 수 있습니다. 이 라이너는 리틀 엔디언 머신에서는 "작은" 인쇄를, 빅 엔디언 머신에서는 "큰" 인쇄를 수행합니다.
python -c "import struct; print 'little' if ord(struct.pack('L', 1)[0]) else 'big'"
"Intel-compatible"은 정확하지 않습니다.
Intel은 빅 엔디언 프로세서, 특히 StrongARM과 XScale을 만들었습니다.일반적으로 x86으로 알려진 IA32 ISA를 사용하지 않습니다.
역사를 거슬러 올라가면 인텔은 또한 x86과 호환되지 않는 리틀 엔디언 i860과 i960을 만들었습니다.
역사를 거슬러 올라가면 x86(8080, 8008 등)의 이전 프로세서도 x86과 호환되지 않습니다.8비트 프로세서이기 때문에 엔디안니스는 중요하지 않습니다.
오늘날 Intel은 여전히 Itanium(IA64)을 생산합니다. 이는 바이엔디언입니다. 정상 작동은 빅엔디언이지만 프로세서는 리틀엔디언 모드에서도 실행할 수 있습니다.little-endian 모드에서 x86 코드를 실행할 수 있지만 네이티브 ISA는 IA32가 아닙니다.
제가 아는 한, AMD의 모든 프로세서는 x86_64와 같은 일부 확장자를 포함하여 x86과 호환되므로 반드시 리틀 엔디언이어야 합니다.
Ubuntu는 x86(리틀 엔디안) 및 x86_64(리틀 엔디안)에 사용할 수 있으며, ia64(빅 엔디안), ARM(엘)(리틀 엔디안), PA-RISC(리틀 엔디안), PowerPC(빅 엔디안) 및 SPARC(빅 엔디안)에 대한 완전한 포트가 적습니다.저는 ARM(eb)(빅엔디언) 포트가 없다고 생각합니다.
아래 코드 조각은 작동합니다.
#include <stdio.h>
int is_little_endian() {
short x = 0x0100; //256
char *p = (char*) &x;
if (p[0] == 0) {
return 1;
}
return 0;
}
int main() {
if (is_little_endian()) {
printf("Little endian machine\n");
} else printf("Big endian machine\n");
return 0;
}
코드의 "짧은" 정수는 0x0100(10진수로 256)이고 길이는 2바이트입니다.최하위 바이트는 00이고, 최상위 바이트는 01입니다.리틀 엔디언 순서는 변수의 주소에 최하위 바이트를 배치합니다.따라서 변수의 포인터가 가리키는 주소의 바이트 값이 0인지 여부만 확인합니다.0이면 리틀 엔디안 바이트 순서이고, 그렇지 않으면 빅 엔디안 바이트 순서입니다.
당신의 마지막 질문에 대한 대답은 아니오입니다.Linux는 이전 세대의 PowerMac과 같은 빅 엔디언 시스템에서 실행할 수 있습니다.
당신은 빅 엔디언 기계용으로 설계된 Ubuntu 버전을 다운로드해야 합니다.저는 PowerPC 버전만 알고 있습니다.좀 더 일반적인 빅엔디안 구현이 가능한 곳을 찾을 수 있을 것이라고 확신합니다.
/* by Linas Samusas */
#ifndef _bitorder
#define _bitorder 0x0008
#if (_bitorder > 8)
#define BE
#else
#define LE
#endif
그리고 이것을 사용합니다.
#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
만약에
unsigned long number1 = Function_Convert_to_be_16(number2);
*macro가 실제 함수를 호출하고 BE로 변환합니다.
만약에
unsigned long number1 = Function_Convert_to_be_16(number2);
*숫자는 함수가 아닌 단어로 정의되며 괄호 사이에 숫자가 들어갑니다.
우는이제리를 가지고 있습니다.std::endian
!
constexpr bool is_little = std::endian::native == std::endian::little;
https://en.cppreference.com/w/cpp/types/endian
언급URL : https://stackoverflow.com/questions/1024951/does-my-amd-based-machine-use-little-endian-or-big-endian
'programing' 카테고리의 다른 글
Spring boot - 백업 로그 파일 수가 7개로 제한됨 (0) | 2023.08.23 |
---|---|
router.navigateBy 사용 방법Url 및 router.navigate in Angular (0) | 2023.08.23 |
CSS를 사용하여 두 번째 마지막 요소 선택 (0) | 2023.08.23 |
특정 지점에서 고정 위치 스크롤을 중지하시겠습니까? (0) | 2023.08.23 |
이미 데이터가 있는 MySQL 데이터베이스 필드에 데이터 추가 (0) | 2023.08.18 |