리틀 엔디안과 빅 엔디안을 확인하는 C 프로그램
중복 가능성 :
빅 엔디안 또는 리틀 엔디안 머신을 결정하는 C 매크로 정의?
int main()
{
int x = 1;
char *y = (char*)&x;
printf("%c\n",*y+48);
}
리틀 엔디안이면 1을 인쇄합니다. 빅 엔디안이면 0을 인쇄합니다. 맞습니까? 아니면 char *를 int x로 설정하면 엔디안에 관계없이 항상 최하위 비트를 가리킬까요?
요컨대, 그렇습니다.
32 비트 컴퓨터에 있다고 가정 해 보겠습니다.
리틀 엔디안 인 x
경우 메모리는 다음과 같습니다.
higher memory
----->
+----+----+----+----+
|0x01|0x00|0x00|0x00|
+----+----+----+----+
A
|
&x
이렇게 (char*)(&x) == 1
하고 *y+48 == '1'
.
빅 엔디안이면 다음과 같습니다.
+----+----+----+----+
|0x00|0x00|0x00|0x01|
+----+----+----+----+
A
|
&x
그래서 이것은 '0'
.
다음이 수행됩니다.
unsigned int x = 1;
printf ("%d", (int) (((char *)&x)[0]));
그리고 설정 &x
하려면 char *
정수의 개별 바이트에 액세스 할 수있게되며, 바이트의 순서는 시스템의 엔디안에 따라 달라집니다.
다음은 구성 스크립트의 빅 엔디안 테스트입니다 .
#include <inttypes.h>
int main(int argc, char ** argv){
volatile uint32_t i=0x01234567;
// return 0 for big endian, 1 for little endian.
return (*((uint8_t*)(&i))) == 0x67;
}
내가 그것에 대해 표준에서 읽었다는 것을 알고 있다고 생각했습니다. 하지만 찾을 수 없습니다. 계속 찾고 있습니다. 낡은; 응답 제목; Q-tex가 아님; P :
다음 프로그램은 다음을 결정합니다.
#include <stdio.h>
#include <stdint.h>
int is_big_endian(void)
{
union {
uint32_t i;
char c[4];
} e = { 0x01000000 };
return e.c[0];
}
int main(void)
{
printf("System is %s-endian.\n",
is_big_endian() ? "big" : "little");
return 0;
}
이 접근 방식 도 있습니다 . Quake II에서 :
byte swaptest[2] = {1,0};
if ( *(short *)swaptest == 1) {
bigendien = false;
그리고 !is_big_endian()
혼합 / 중간이 될 수 있기 때문에 100 %가되지 않습니다.
이것은 단지에서 값을 변경 동일한 방법을 사용하여 확인할 수 있습니다 믿어 0x01000000
즉을 0x01020304
제공 :
switch(e.c[0]) {
case 0x01: BIG
case 0x02: MIX
default: LITTLE
그러나 그것에 대해 완전히 확신하지는 못합니다 ...
참고 URL : https://stackoverflow.com/questions/12791864/c-program-to-check-little-vs-big-endian
'Development Tip' 카테고리의 다른 글
null android를 반환하는 카메라 활동 (0) | 2020.12.03 |
---|---|
간단한 PostgreSQL 삽입이 작동하지 않습니다. (0) | 2020.12.03 |
속성 라우팅을 사용하는 동안 쿼리 문자열이 작동하지 않음 (0) | 2020.12.03 |
Xcode에서 Info.plist를 열 수 없음 — "해당 파일이 없습니다"라는 오류 메시지 (0) | 2020.12.02 |
Android에서 DialogFragment의 위치 (0) | 2020.12.02 |