maximum - C++에서 서명 된 것과 같이 서명되지 않은(long) int 해석




unsigned int arduino (2)

2의 보수에서 2 ^ n의 모듈로 값을 래핑하기 때문에 값 연산을 단순히 캐스팅합니다. 즉, 다른 비트 유형과 동일한 비트 패턴을 처리합니다. 예를 들어 (long)0xFFFFFFFFu 는 -1을 반환합니다.

그러나, 더하기 및 빼기 모두 더 1 개의 carry / borrow 비트를 생성 합니다. 하나 더 많은 비트가 낮은 32 비트와 함께 저장되어야합니다. 따라서 값을 signed 가 붙이고 빼기로 단순히 캐스팅하는 것은 효과가 없지만 서로별로 멀지 않은 값에 대해서는 작동합니다. LONG_MAX - LONG_MIN 또는 LONG_MIN - LONG_MAX 를 사용하면 피연산자가 모두 long 경우에도 결과를 long 저장할 수 없습니다.

이 문제를 극복하려면 유일한 방법은 더 넓은 유형을 사용하는 것입니다.

return static_cast<long long>(time4) - static_cast<long long>(currTimeLo);

또는 수동으로 큰 int 산술을 처리합니다.

if (time4 > rcurrTimeLo) // time hasn't overflowed
{
    timediff = time4 - rcurrTimeLo;
    // do something, for example set overflow flag:
    OV = 0;
}
else
{
    timediff = rcurrTimeLo - time4;
    // do something, for example set overflow flag:
    OV = 1;
}

함수에서이 함수를 사용하는 경우 오버플로 캐리와 낮은 32 비트 차이를 반환해야하므로 32 비트 또는 64 비트 컴퓨터에서 첫 번째 솔루션이 더 쉽게 보이고 8 비트 시스템에서는 두 번째가 더 빠를 것입니다. ATmega와 같은 비트 MCU

2 피연산자가 서로 멀리 떨어져있는 LONG_MAX 보다 LONG_MAX 것을 보증 할 수 있다면 간단한 static_cast 에서 long으로 작동합니다

return static_cast<long>(time4) - static_cast<long>(currTimeLo);

Arduino C ++에서 :

unsigned long의 32 비트를 부호있는 long으로 재 해석하려고합니다. 정확한 비트는 부호없는 정수 대신 2의 보수로 간주됩니다. 나는 단순히 그것을 (긴) 캐스팅하는 것이 트릭을 할 것이라고 생각하지 않는다. 내가 잘못?

아니면 더 좋은 방법이있을 것입니다. 타이머로 부호없는 long을 사용하고 있습니다. 때로는 현재 값을 읽고 이전 읽기 (부호없는 long 값 모두)와 비교하여 시간이 얼마나 경과했는지 확인합니다. 가능한 오버 플로우를 처리해야하는데, 이는 현재 값이 이전 값보다 작을 수 있습니다. 서명 된 long과 빼기로 두 값을 해석하면 정답을 얻는 것처럼 보입니다.

나는 이것을 시도했다 :

return reinterpret_cast<long>(time4) - reinterpret_cast<long>(currTimeLo); // treat unsigned as 2's complement

하지만 컴파일러 오류가 발생했습니다.

Arduino : 1.6.7 (Mac OS X), 게시판 : 'long int'를 입력하기 위해 'long unsigned int'유형의 'Arduino Nano, ATmega328'


다음과 같이 static_cast 를 사용하려고합니다.

static_cast<signed long>(your_unsigned_long)






signed