假设我正在处理4位操作。所以如果我遇到一个二进制数字说
1111
然后我应该推断出什么?是-1还是15?
答案 0 :(得分:2)
“这取决于”。
这些位(在这种情况下)编码一个数字,但你必须知道哪种数字(有符号或无符号,整数,定点或浮点数)才能解释编码位。
如果数字应该用二进制补码,那么正确的解释是-1,如果它是无符号的那么它是15。
单靠这四个位来决定是不可能的,这根本就没有足够的信息。
当然,对于“全尺寸”值也是如此,它可能是int
或unsigned int
,您必须知道这是为了正确解释这些位。
更新:如果您知道您的号码应该被签名,那么处理它的最简单方法(假设C,通常没有签名) 4位整数类型)是符号扩展它为可用的形式。
符号扩展仅涉及获取较少位数的最高位,并将其重复到左侧直至(并包括)目标位的最高位。
所以在你的情况下,你有0xf
,其最高位是1.扩展到int8_t
,我们得到:
const int8_t number = 0xff;
这是-1。
没有内置的方法可以从任意几位数进行此符号扩展,因为C本身无法处理这些。
这是一种天真的方法:
// Sign-extend a n-bit number into 32 bits.
int32_t extend(uint32_t bits, size_t n)
{
const bool top = bits & ((uint32_t) 1 << (n - 1));
if (top)
{
for (size_t i = n; i < 32; ++i)
bits |= 1 << i;
}
return bits;
}
如果您使用您的号码拨打上述内容:
printf("%d\n", (int) extend(0xf, 4));
打印-1
。