2011-03-30 5 views
5

두 기계 수LB를 보자. L 위해 그 비트에서 LSB (최하위 비트) MSB (최상위 비트) B MSB에서 LSB 순서 됨과한다. 즉, L은 Little Endian을 사용하는 반면 B은 Big Endian 비트을 사용하며 바이트 순서와 혼동하지 마십시오.비트 엔디안은 C에서 비트 단위 시프트 및 파일 IO에 어떤 영향을 줍니까?

문제 1 해결 :

우리는 우리가 이식 할 다음 코드 작성 :

#include <stdio.h> 

int main() 
{ 
    unsigned char a = 1; 
    a <<= 1; 

    printf("a = %d\n", (int) a); 

    return 0; 
} 

L에를, 그것은 2를 인쇄하지만, 무엇 B에서 발생? 1을 이동하여 0을 인쇄합니까?

SOLUTION : 6.5.7에서 정의 C99 적어도 부호없는 정수 형태에 <<>> 각각 2 곱 나눈 것이다 그것은, 말한다.

문제 2 :

우리는 우리가 이식 할 다음 코드 작성 :

READ 프로그램 :

/* program READ */ 
#include <stdio.h> 

int main() 
{ 
    FILE* fp; 
    unsigned char a; 

    fp = fopen("data.dat", "rb"); 
    fread(&a, 1, 1, fp); 
    fclose(fp); 

    return 0; 
} 

및 WRITE 프로그램 :

/* program WRITE */ 
#include <stdio.h> 

int main() 
{ 
    FILE* fp; 
    unsigned char a = 1; 

    fp = fopen("data.dat", "wb"); 
    fwrite(&a, 1, 1, fp); 
    fclose(fp); 

    return 0; 
} 

무엇 L에 쓰기를 실행하면 발생합니다., mo 데이터 파일을 B 및 으로 실행 하시겠습니까? 우리가 B에 쓰기를 실행하고 있다면 다음 L에 읽어?

죄송합니다. FAQ입니다. 나는 운이없이 몇 시간 동안 봤어.

답변

7

비트 엔디안 바이트의 디스크에 저장된 데이터에 영향을주지 않습니다. Byte Endianness will.

비트 엔디안은 바이트가 한 번에 한 비트 씩 전송되는 직렬 인터페이스에서 중요하며 발신자와 수신자는 바이트 순서에 동의해야합니다. 예를 들어 SPI 장치의 비트 순서가 다양하므로 장치에서 읽으려고하기 전에 데이터 시트를 참조해야합니다.

용어는 가 저장된 값의 표현에 대해 이야기 할 때 그들은 단지에 대한 의미가 같은 엔디안 또는 비트 수준 엔디안 거의 사용되지 않는 비트 : 여기

Wikipedia는 비트 엔디 언에 말씀입니다 드문 컴퓨터 각 개별 주소 비트는 고유 한 주소가 있습니다. 그러나 연속 매체를 통한 비트의 전송 순서는 입니다. 대부분의 경우 은 하드웨어에 의해 투명하게 관리되며, 반대 순서 (예 : I²C)가 인 프로토콜이 존재하지만, 리틀 엔디안 (낮은 비트 우선)의 비트 레벨 아날로그 입니다. 네트워킹에서, 비트 전송의 순서에 대한 결정은 OSI 모델의 데이터 링크 맨 아래에 으로 이루어집니다. 귀하의 경우에는

는 실제 하드 드라이브 인터페이스에 관계없이 읽거나 쓸 것 프로세서의 비트 순서를 정의합니다.

+0

그래서 파일의 입출력 (endianness)이 파일 IO와 관련이 없다고 말합니다. 어떤 종류의 표준인가요? 그렇다면 링크가 정의 된 위치에 게시 할 수 있습니까? – rogi

+0

이제 이것이 의미가 있습니다. – rogi

+0

파일 I/O가 전체 바이트 읽기로 정의됩니다. 파일에서 1 바이트 미만을 읽을 수는 없습니다. 비트 순서는 저장 매체 (SCSI, SATA, USB Mass Storage 등)에 대한 인터페이스에 따라 다르며 직렬 인터페이스 (예 : SATA butnot PATA) 만 영향을받는다고 생각합니다. – tomlogic

2

비트 - 이동 엔디안의 영향을받지 않습니다. 이진 파일 입출력은 일반적으로는 가능하지만 한 바이트 만 쓰고 있기 때문에 귀하의 경우는 아닙니다.

+1

저는 _bit_ 엔디 언스에 관심이 있고 _byte_에 관심이 없습니다. – rogi

+1

"비트"엔디안이 다른 플랫폼은 무엇입니까? – EboMike

+1

어쨌든 "1 << 1"의 결과로 "2"를주지 않는 것은 폐차장으로 가야합니다. – EboMike

0

endianness는 a) 쓰기에 사용한 것과 다른 유형으로 메모리에서 내용을 읽거나 다른 엔디안을 사용하여 컴퓨터로 작성된 파일에서 내용을 읽지 않는 한 영향을 미치지 않습니다.

int data; 
char charVal; 

*data = 1; 
charval = *((char *) data); // Different result based on endianness 

아니면 예를 들어 두, 당신은 문자보다 큰 타입을 사용하는 가정.

+0

와트? _byits_가 아닌 _bits_에 대해 알고 싶습니다.귀하의 예제는 정의되지 않은 동작입니다. – rogi

+3

다른 답변에 대한 내 의견보기. 뭔가 오해했을 수도 있습니다. 빅 엔디안과 리틀 엔디안은 바이트 순서를 나타냅니다. – EboMike

+0

나는 _bit_ order를 참조한다. 테 질문은 그것을 강조합니다. – rogi

3

>> (및 <<)은 오른쪽 (또는 왼쪽) 비트를 밀지 (당기지) 않습니다.
그들은 분할 (또는 곱) 컴파일러는 관심있는 모든 2.

에 의해, 비트는 수직으로 적층 될 수있다 :

+1

기술적으로는 그렇지 않습니다. 음수를 사용하면 '/ 2'와 '>> 1'사이에는 차이가 있습니다. 또한 일부 CPU는 전환하는 것보다 분할하는 것이 훨씬 느리기 때문에 내부적으로 전환 작업을 수행합니다. – EboMike

+0

사실 당신은 거의 옳습니다. C99 표준은 >> 및 <<을 나눗셈으로 정의하고 부호없는 정수에서 2를 곱합니다. 이 질문에 추가 할 것입니다. – rogi

+0

6.5.7 절은 mignight의 경우 다소 밀도가 높지만 비트 단위 시프트를 사용하는 표현식의 결과 * 값 *은 나눗셈과 2를 곱하는 식으로 설명됩니다. 어쨌든 +1 @Ebo는 음수와 관련된 차이를 나타냅니다 – pmg

4

적어도 C에 관한 한 비트 엔디안과 같은 것은 없습니다. CHAR_BIT은 사양에 따라 적어도 8이어야합니다. 따라서 이보다 작은 객체에 대한 액세스는 표준 C 프로그램에 거의 무의미합니다. 하드웨어가 바이트 - LSB 또는 MSB를 먼저 저장하는 방법과 상관없이, 이는 프로그램에 전혀 영향을 미치지 않습니다. myVar & 1은 두 경우 모두 오른쪽 비트를 반환합니다.

일종의 직렬 인터페이스와 상호 작용하고 그로부터 바이트를 다시 구성해야하는 경우에는 다른 이야기입니다. 자신의 머신의 '비트 엔디안'은 여전히 ​​영향을 미치지 않지만 인터페이스의 비트 순서는 확실히 영향을 미칩니다.

이제 특정 질문과 나와있는 프로그램에 관해서. 귀하의 프로그램은 거의 100 % 이식 가능합니다. 비트 엔디안과 바이트 엔디안 둘 다 엔티티에 영향을 미치지 않습니다. 일 수 있습니다. CHAR_BIT은 각 플랫폼마다 다릅니다. 한 컴퓨터는 다른 컴퓨터보다 더 많은 데이터를 쓸 수도 있고 그 반대의 경우도 가능합니다.

+0

당신의 대답은 저를 생각하게했습니다 : 만약 문자 크기가 구현에 의해 정의된다면, fread와 fwrite를 가진 이식 가능한 파일을 만들 방법이 없습니다. 내가 맞습니까? – rogi

+1

@rogi, 휴대용 일 수 있는지 확인하십시오. 올바른 비트 수를 복사하고 있는지 확인하십시오! 'CHAR_BIT' 상수를 사용하여 프로그램을 이식성있게 유지할 수 있습니다. –

+0

오. 귀하의 답변 주셔서 감사합니다! 이 문제에 대해 다른 질문을 할 것입니다! – rogi

관련 문제