2014-12-27 5 views
2

간단 소리에도 불구하고, C 번호는 힘든 작업이 부호없는 값으로 정수를 (AN 오프셋)를 추가 할 수 있습니다 :추가 C#으로 부호에 부호있는 정수

unsigned uintValue; 
int offset; 
// ... 
uintValue += offset; // causes error CS0266 

이것은 변환하여 수행 할 수 있습니다 부호가있는 값으로 상쇄되었지만 다소 불안전하고보기 흉한 것처럼 보입니다. 오프셋이 uintValue보다 작은 경우 위험합니다. 추한 형식 변환을 사용하지 않고이 간단한 문제에 대한 우아한 해결책이 있습니까?

내 응용 프로그램에서 offset은 양수 또는 음수 일 수 있습니다. 그렇지 않으면 해결책은 간단합니다.

+2

는 "이것은 서명 된 값으로 오프셋 (offset)로 변환하여 수행 할 수 있습니다"그것은 이미. – Boann

+0

아니요. 형식 변환이 해킹되지 않습니다. offset 값을 기반으로 uintValue를 사용하면됩니다. –

답변

0

여기에 캐스트가 필요합니다. 재질 - 구글 번역 참고 다음

uIntValue = (offset < 0 ? 
       uIntValue - (uint)(offset * (-1)) : 
       uIntValue + (uint)(offset)); 

그것은 오프셋이 음수 인 경우, 그것은 긍정적하고 uIntValue, 에서을 줄일 수 있다는 것을 의미 오프셋 (offset)가 양수이면, 그것은 단순히

1

내가 생각할 수있는 추가합니다 그것을 안전하게하는 두 가지 방법; 불행하게도, 어느 하나가 특히 우아한 :

  • 변환 long에 두 피연산자가 충분히 비트를 보장 작업을 수행하고, unsigned 결과를 다시 주조, 또는
  • offset의 기호에 따라 조건부하기 위해, + 또는 -을 오프셋의 절대 값과 함께 사용하고 적절하게 unsigned으로 캐스트하십시오.

이 추가로 4 바이트 필요하기 때문에 첫 번째 방법은 코드를 더 쉽게,하지만 약간 더 낭비 그러나

uintValue = (unsigned)((long)uintValue + offset); 

를, 그것은 조건문이없는, 그래서 더 빨리 결국 수 있습니다 .

참고 :이 스키마는 추가 결과가 음수 일 때 잘못된 결과를 생성합니다.

+0

확인 된 산술 문맥에서 부호없는 값이 랩핑되면 위의 코드는 실패합니다. 그것이 무엇을 위해 사용되었는지에 따라 좋거나 나쁠 수 있습니다. 비트 연산자'UInt32 & UInt64 -> Uint32', UInt32 & Int64 -> Uint32', UInt64 & UInt32 -> UInt32' 및'Int64 & UInt32 -> Uint32에 대한 오버로드가 너무 나쁘다. '때문에, 이러한 과부하는 컴퓨터 결과를 비트 마스킹 할 때 어리석은 캐스트를 피할 것이기 때문입니다. – supercat

0

당신은 가능한 한 음의 값을 보상 같은 유형으로 피연산자를 캐스팅해야합니다

 uint uintValue = 1000; 
     int offset = -1000; 
     uintValue = (offset < 0 ? uintValue - (uint)(-1 * offset) : uintValue + (uint)offset);