gpt4 book ai didi

c - 如何区分二进制负数?

转载 作者:行者123 更新时间:2023-12-03 03:39:14 25 4
gpt4 key购买 nike

假设我正在处理 4 位操作。所以如果我遇到一个二进制数字说

1111

那我应该推断什么呢?是-1还是15?

最佳答案

“这取决于”。

这些位(在本例中)对数字进行编码,但您必须知道哪种数字(有符号或无符号、整数、定点或浮点)才能解释编码的位。

如果数字应该以二进制补码形式签名,那么正确的解释是 -1,如果它是无符号的,则正确的解释是 15。

不可能仅根据这四位来做出决定,它根本没有足够的信息。

对于“全尺寸”值来说当然也是如此,它可以是 intunsigned 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

关于c - 如何区分二进制负数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40028540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com