2011-12-22 7 views
3

입니다. 그래서 char을 길게, 그리고 지우고, 다시 해보려고합니다. 15의 시프트로 인해 내 컴퓨터가 이상하게 변하게됩니다. 코드의 주석을 참조하십시오. 이 원인이 무엇이라고 생각하십니까?C 비트 쉬프트 홀드 결과는 왼쪽으로 15 비트 쉬프트하여

이 기계의 문자 × 00, 당신은 너무 멀리와 오버 플로우를 유도하는 결과로 unsigned char 이동하고 마치 0000

unsigned char temp; 
    unsigned long open_code; 

    temp = 0x01; 
    open_code = open_code | (temp <<1);// open_code = 0x0000 0002 
    open_code = 0; 
    //......  
    // 2 - 7  
    //.... 
    temp = 0x01; 
    open_code = open_code | (temp <<8); // open_code = 0x0000 0100 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<9); // open_code = 0x0000 0200 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<10); // open_code = 0x0000 0400 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<11); // open_code = 0x0000 0800 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<12); // open_code = 0x0000 1000 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<13); // open_code = 0x0000 2000 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<14); // open_code = 0x0000 4000 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<15); // open_code = 0xFFFF 8000 !!!!! 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<16); // open_code = 0x0000 0000 !!!!! 
+0

당신이 다음을 이동, 긴 첫번째로 복사 문자를 시도? –

+0

나에게 완벽하게 "정상적인"것처럼 보입니다. C의 다양한 캐스팅 규칙 (종종 어렵다)의 상호 작용. –

+0

어떤 플랫폼을 사용하고 계십니까? –

답변

2

긴 0000. 과 같이, 이동하기 전에 long에 캐스팅보십시오 :

open_code = open_code | (((long)temp) <<15); 
+0

ok 변화는 내부 온도에서 일어난 것입니까? 그건 의미가 있습니다. – eagletusk

+0

@ user2758 : 나는 그것이 일어나고 있다고 말하는 것이 정확하다고 확신하지 못합니다. 사실, 당신 말이 맞을 수도 있고 제 대답이 틀릴 수도 있습니다. 'temp'를 더 큰 타입으로 만들어야 할 수도 있습니다! –

+1

시프트 연산자가 실행되기 전에 temp가 int로 승격됩니다. 이 문제는 int와 관련이있을 가능성이 높지만 내 머리를 감싸 안았습니다. –