2014-11-28 2 views
2

일부 코드를 연구 중이며 Visual Studio 컴파일러에서 컴파일 오류에 대해 불만을 표시합니다. 음수를 부호없는 긴 정수로 캐스팅합니다.이 "캐스트 음수에서 부호없는 정수로"관용구의 의미는 무엇입니까?

var foo = new FancyMapArea((long)((ulong)-2147483648), (long)((ulong)-2147483648), 256, 256) 

어떤이의 의도 일 수 있었다 : 그냥 같이, 원래의 소스 코드에서 얼마나

그러나, 그건? 그리고 만약 그것이 바보라면, 의도 된 결과를 얻는 동안 이것을 컴파일해야합니까?

UPDATE/중요 참고 :

이 소스 코드는 그래서 아마도 실제로 인간 개발자가 입력되지 않은, ILSpy의 디 컴파일러에 의해 생성되었습니다.

+0

이것은 의미가없는 것처럼 보입니다. ulong은 동일한 바이트를 가지고 있기 때문에. 그래서'(ulong)'캐스트를 건너 뛰십시오. – Eun

+0

아마 절대 값을 얻는 방법으로 캐스트를 사용하고있을 것입니다. – Grice

+0

2s-complement 바이너리 일 수도 있습니다. – DavidG

답변

2

ulong은 부호있는 정수 값을 저장하지 않아야합니다. 정수의 부호 값을 저장하는 데 마지막 비트를 사용하지 않기 때문입니다. 당신은 당신이 결국 다음 모두 ulong에 중간 변환을 제거 long로 전환하는 경우 모든 말했다되고

  string a = aaa.ToString(); 
      ulong b = ulong.MaxValue; //18446744073709551615 

      unchecked 
      { 
       b = (ulong)(-20); //18446744073709551596 
      } 

값에 대한 당신의 행동 주위에 랩을 얻을 것이다이있는 같은 것을 사용하는 unchecked 키워드를 사용해야합니다.

var foo = new FancyMapArea((long)(-2147483648), (long)(-2147483648), 256, 256) 
+0

이것은 "랩 어라운드 (wrap around) 동작"이 응용 프로그램 (예 : 180 ° 자오선을 건너 뛸 때 좌표가 "랩"될 것으로 예상되는 매핑 1)에 대해 의미가 있으므로 흥미 롭습니다. 그렇다면 원본 소스에 "확인되지 않은"블록이없는 이유는 무엇이라고 생각하십니까? – heltonbiker

+0

각 산술 연산에서 오버플로를 확인해야한다고 상상해보십시오. 그러면 응용 프로그램에 많은 성능 저하가 발생합니다. 대부분의 경우 이는 필수 사항은 아니며 코드에서 중복되는 부분이 있는지 알고 싶습니다. –

+0

원래 소스가 "검사되지 않음"을 가지지 않은 이유는 지금 컴파일되지도 않았기 때문입니다. "unchecked"(그리고 코드를 변경해야합니다 - 바람직하지 않은) 필요가 있습니다. 또는 원래 개발자가 수행 한 것과 동일한 마법을 수행해야합니다 (코드가 컴파일되도록). – heltonbiker