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)