카운트 다운시 오버플로를 음수 값으로 바꾸는 쉬운 방법이 있습니까?오버플로를 음수로 변환
예 : 32 비트 변수. 가능한 값은 0x00000000 - 0xFFFFFFFF입니다. 가능한 가장 낮은 값 (0x00000000 - 1)에서 1을 뺀 결과는 0xFFFFFFFF입니다. -1의 결과를 얻기 위해 연산을 어떻게 바꿀 수 있습니까?
카운트 다운시 오버플로를 음수 값으로 바꾸는 쉬운 방법이 있습니까?오버플로를 음수로 변환
예 : 32 비트 변수. 가능한 값은 0x00000000 - 0xFFFFFFFF입니다. 가능한 가장 낮은 값 (0x00000000 - 1)에서 1을 뺀 결과는 0xFFFFFFFF입니다. -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
'서명되지 않은'대신 '서명 된'형식을 사용합니다. 64 비트가 아니라'0x00000000' -'0xFFFFFFFF' *와'-1' 값을 저장할 수 없다. –
...하지만 '서명 된'오버플로가 정의되지 않은 동작을 호출하는 것을주의하십시오. –
'long long result = var_uint32_bit - 1LL; ' – chux