이 정말 2의 보수를 사용하여 N 비트로 표현되는 숫자로 임의의 비트 패턴을 해석에 관한 경우, 여기에 몇 가지 실수 예제 코드는 그 일의 :
#include <stdio.h>
#include <inttypes.h>
// this assumes the number is in the least significant `bits`, with
// the most significat of these being the sign bit.
int32_t fromTwosComplement(uint32_t pattern, unsigned int bits)
{
// read sign bit
int negative = !!(pattern & (1U << (bits-1)));
// bit mask for all bits *except* the sign bit
uint32_t mask = (1U << (bits-1)) - 1;
// extract value without sign
uint32_t val = pattern & mask;
if (negative)
{
// if negative, apply two's complement
val ^= mask;
++val;
return -val;
}
else
{
return val;
}
}
int main(void)
{
printf("%" PRId32 "\n", fromTwosComplement(0x1f, 5)); // output -1
printf("%" PRId32 "\n", fromTwosComplement(0x01, 5)); // output 1
}
컴파일러에서 사용하는 음수 표현에 관계없이 2의 보수를 조작 하시겠습니까? 아니면 그냥 가정일까요? 전자를 실제로 의미하는 경우 모든 (값) 비트를 완전히 제어하려면 ** 서명되지 않은 ** 유형을 사용해야합니다. –
아하, 그렇습니다. 그것은 내가 의미했던 것입니다. – Kyle
일반적으로 [정수 승격] (http://en.cppreference.com/w/c/language/conversion#Integer_promotions)의 일부로 자동으로 발생합니다. 예를 들어 컴파일러에서 [일반 산술 변환] (http : /en.cppreference.com/w/c/language/conversion#Usual_arithmetic_conversions). –