2013-05-16 1 views
1

전통적인 지혜는 당신이 int을 만들기 위해 함께 bytes을 논리합 연산 할 때, 당신의 + 운영자가 아닌 | 연산자를 사용한다, 그렇지 않으면 당신은 부호 비트에 문제가있을 수 있음을 가지고있다.일반적인 지혜에도 불구하고 | 대신 | 바이트를 int로 결합하면 항상 작동합니까?

그러나 C#의 경우는 그렇지 않습니다. 행복하게 + 연산자를 사용할 수있는 것처럼 보이고 부정적인 결과에도 여전히 작동합니다.

내 질문 :

  • 이 정말 사실인가요?
  • 그렇다면 왜 작동합니까? 여기

내가 + 연산자와 | 운영자 및 검증한다을 사용하여 4 바이트의 가능한 모든 조합을 테스트 믿고 테스트 프로그램입니다 - (저를 포함한 많은 사람들을 할 이유가 없습니다한다고 생각합니다!) 두 가지 방법 모두 동일한 결과를 산출합니다.

using System; 
using System.Diagnostics; 

namespace Demo 
{ 
    class Program 
    { 
     int Convert1(byte b1, byte b2, byte b3, byte b4) 
     { 
      return b1 + (b2 << 8) + (b3 << 16) + (b4 << 24); 
     } 

     int Convert2(byte b1, byte b2, byte b3, byte b4) 
     { 
      return b1 | (b2 << 8) | (b3 << 16) | (b4 << 24); 
     } 

     void Run() 
     { 
      byte b = 0xff; 

      Trace.Assert(Convert1(b, b, b, b) == -1); // Sanity check. 
      Trace.Assert(Convert2(b, b, b, b) == -1); 

      for (int i = 0; i < 256; ++i) 
      { 
       Console.WriteLine(i); 
       byte b1 = (byte) i; 

       for (int j = 0; j < 256; ++j) 
       { 
        byte b2 = (byte) j; 

        for (int k = 0; k < 256; ++k) 
        { 
         byte b3 = (byte) k; 

         for (int l = 0; l < 256; ++l) 
         { 
          byte b4 = (byte) l; 
          Trace.Assert(Convert1(b1, b2, b3, b4) == Convert2(b1, b2, b3, b4)); 
         } 
        } 
       } 
      } 

      Console.WriteLine("Done."); 
     } 

     static void Main() 
     { 
      new Program().Run(); 
     } 
    } 
} 

[편집]

이 어떻게 작동하는지 보려면,이 사항을 고려하십시오 :

byte b = 0xff; 

int i1 = b; 
int i2 = (b << 8); 
int i3 = (b << 16); 
int i4 = (b << 24); 

Console.WriteLine(i1); 
Console.WriteLine(i2); 
Console.WriteLine(i3); 
Console.WriteLine(i4); 

int total = i1 + i2 + i3 + i4; 

Console.WriteLine(total); 

이 인쇄 :

255 
65280 
16711680 
-16777216 
-1 
,536 여기

는 테스트 코드입니다

아하!

+1

비트가 겹치지 않으므로 작동하므로 절대로 캐리가 없습니다. 나는 이것이 결코 작동하지 않는다는 것을 들어 본 적이 없으며, 아무것도 정의되지 않은 C로부터의 잔류 물이 아닌가? – harold

+0

글쎄, 내가이 질문을 한 이유는 다른 질문에 대한 대답이 기호 비트 문제의 경우'+ '대신'|'를 사용하도록 편집 되었기 때문이었다. –

+1

바이트가 서명 된 경우 @dlev, OR 연산이 작동하지 않습니다. 상위 비트는 1이됩니다 (바이트 중 하나가 음수이면). int로 업 캐스트 한 후 255로 AND해야합니다. – harold

답변

2

차이 :

  1. 비트가 중첩되면 |+ 생산할 것이다 다른 결과 실제로 서명 바이트를 사용하는 경우

    2 | 3 = 3 
    2 + 3 = 5 
    
  2. 이 결과는 상이 할 것이다

    -2 | -3 = -1 
    -2 + (-3) = -5 
    
+0

물론 OK입니다. 나는 질문에 일찍 답한 사람들을 "교정"하는 것으로 다소 연기되었다. 수정이 필요하지 않은 것처럼 보입니다 (그러나 비트가 겹쳐져도 항상 작동하기 때문에 언제나'|'를 사용하는 것이 좋습니다). –

+0

@MatthewWatson : IMO 귀하의 답변 변경은 불필요합니다. 특히 주어진 상황에서. –

관련 문제