2017-03-22 6 views
-1

카운트 다운시 오버플로를 음수 값으로 바꾸는 쉬운 방법이 있습니까?오버플로를 음수로 변환

예 : 32 비트 변수. 가능한 값은 0x00000000 - 0xFFFFFFFF입니다. 가능한 가장 낮은 값 (0x00000000 - 1)에서 1을 뺀 결과는 0xFFFFFFFF입니다. -1의 결과를 얻기 위해 연산을 어떻게 바꿀 수 있습니까?

+1

'서명되지 않은'대신 '서명 된'형식을 사용합니다. 64 비트가 아니라'0x00000000' -'0xFFFFFFFF' *와'-1' 값을 저장할 수 없다. –

+1

...하지만 '서명 된'오버플로가 정의되지 않은 동작을 호출하는 것을주의하십시오. –

+0

'long long result = var_uint32_bit - 1LL; ' – chux

답변

1

음수 값으로 카운트 다운시 오버플로를 대체하는 쉬운 방법이 있습니까?

더 넓은 수학을 사용하면 직접적인 접근 방식입니다. 가변 일부 부호 형 uint32_t 같은 것을 의미한다 -

. "예를 0xFFFFFFFF로 32 비트 변수는 가능한 값을 0x00000000이다." 영업 이익은보고 (uint32_t)0에서 1을 빼면


(uint32_t)0xFFFFFFFF입니다. 그래서 대신 대안 코드 형 서명 대응 동일한 폭을 고수 할 수 또는 int64_t

// Insure subtraction is done using `long long` math with 1LL 
long long result = var_uint32_bit - 1LL; 

(적어도 64 비트이다) long long처럼 넓은 서명 연산을 사용한다. (int32_t)var_uint32_bit

// Only non-implementation defined for values 0...0x7FFFFFFF 
int32_t result = (int32_t)var_uint32_bit - 1; 

는 정수형 서명 부호 형식 변환에 관한 제한을 갖는다.

그렇지 않으면 새 유형이 서명되고 값을 표현할 수 없습니다. 결과가 구현 정의 또는 구현 정의 신호가 발생합니다. C11dr §6.3.1.3 3