반응형
체크하는 C 프로그램 vs 빅 엔디안
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'
. (48은 '0'의 아스키 코드)
빅 엔디안이라면 다음과 같다.
+----+----+----+----+
|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;
}
당신은 또한 이런 접근법을 가지고 있다; 퀘이크 2:
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
반응형
'programing' 카테고리의 다른 글
새로 고침 후 Vue PWA가 새 콘텐츠를 가져오지 않음 (0) | 2022.04.26 |
---|---|
Vue CLI - 정적 파일에 자산 폴더의 이미지 포함 (0) | 2022.04.26 |
정적 메서드 사용 시기 (0) | 2022.04.25 |
Java에서 상속을 금지해야 하는 좋은 이유? (0) | 2022.04.25 |
Vuejs에서, 모델을 단추에 묶는 것이 가능한가? (0) | 2022.04.25 |