전통적인 지혜는 당신이 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 여기
는 테스트 코드입니다
아하!
비트가 겹치지 않으므로 작동하므로 절대로 캐리가 없습니다. 나는 이것이 결코 작동하지 않는다는 것을 들어 본 적이 없으며, 아무것도 정의되지 않은 C로부터의 잔류 물이 아닌가? – harold
글쎄, 내가이 질문을 한 이유는 다른 질문에 대한 대답이 기호 비트 문제의 경우'+ '대신'|'를 사용하도록 편집 되었기 때문이었다. –
바이트가 서명 된 경우 @dlev, OR 연산이 작동하지 않습니다. 상위 비트는 1이됩니다 (바이트 중 하나가 음수이면). int로 업 캐스트 한 후 255로 AND해야합니다. – harold