2013-02-01 2 views
1

나는 리틀 엔디안의 "친절한"ISA를 가지고있다. 기본 메모리 유닛컴파일러와 엔디안

00000000: BEFC03FF 00008000 

가 "낮은"BEFC03FF 정수이고 "하이"정수 00008000 것을 나타내는 정수 아닌 byte.For 예이다. 일부 비트로 표시된 값을 읽어야합니다. 예를 들어 비트 31에서 47까지입니다. VS10 (C++)에서 uint64_t var = 0x00008000BEFC03FF 을 생성 한 후 var & mask의 값을 확인한 후이를 수행합니다. 그런 식으로하는 것이 합법적입니까? 저는 uint64_t 비트 배열에 대한 가정을하고 있습니다 - 합법적입니까? 컴파일러와 모든 OS (hw에 의존하지 않음)에서 uint64_t의 비트 배열을 이렇게 가정 할 수 있습니까?

+1

는 당신이 실제로 어떻게해야합니까 바이트 순서를 교환 할 수있는 소프트웨어에 달려있다? 특정 메모리 주소를 읽거나 쓰거나 다른 형식의 I/O를 수행해야합니까? 그렇지 않다면 엔디안에 대해 걱정할 필요가 없습니다. –

+0

@OliCharlesworth - 내가 원하는 것을 작성하지 않았습니까? I/O가 아닌 경우 - 엔디안에 대해 걱정할 필요가없는 이유는 무엇입니까? 개념을 이해하고 컴파일러에 의존하는지 알고 싶습니다. – Yakov

+0

결과 'uint64_t var = 0x00008000BEFC03FF; var & mask'는 엔디안에 의존하지 않습니다. 엔디 언은 기본 표현에 관심이있는 경우에만 중요합니다 (이것이 IO에 중요한 이유입니다). –

답변

1

당신이 맞다면, 입니다.

그러나 ISA가 리틀 엔디안이기 때문에 즉, AD [31 : 0]이있는 경우 정수의 최하위 비트가 비트 0에 채워집니다. 프로세서가 리틀 엔디안이라면 가정합니다. 걱정할 것이 없다. 데이터가 메모리에 기록 할 때, 그것은 올바른 바이트 순서를 가져야한다

0000 FF 
0001 03 
0002 .. 

가정 외부 버스 프로토콜 큰 엔디안이고 프로세서가 리틀 엔디안 경우. 프로세서의 16 비트 정수라고 가정하면 0x1234는 기본 형식의 0001_0010_0011_0100이지만 버스의 경우 0010_1100_0100_1000 (16 비트라고 가정)입니다. 이 경우

가 멀티 바이트 데이터 엔디안 경계를 교차하는 바이트 내부 만 교환 비트가 바이트의 메모리 인접에 보존해야하므로 하드웨어. 하드웨어 교체 후, 그것은된다 :

0000 0001_0010 
0001 0011_0100 

다음은

관련 문제