我有某种负值,我需要等效的正值。我将MAX + 1添加到该值,其中MAX是可以用多个位表示的最大值,我们可以解决此问题。但它没有帮助。例如,请查看以下代码:
#include <stdio.h>
int main()
{
long long int i;
unsigned long long u;
u = 0xffffffff38034080;
u = 0xffffffffffffffff + u + 1;
printf("0x%llx", u);
}
但是这个程序会返回相同的负数。
该计划的输出是:0xffffffff38034080
。我希望它是0x0000000038034080
答案 0 :(得分:4)
我认为你所寻找的是2的补充:
{
unsigned long long u;
u = 0xffffffff38034080;
u = ~u + 1;
printf("0x%llx", u);
}
答案 1 :(得分:1)
检查数字的最高位。如果已设置,则向左移动一个以将其移除并递增位计数器。重复,直到没有设置最高位。
一旦你做完了,就在柜台右转。这将以0的位移位。
unsigned long long u;
int i,cnt = 0;
u = 0xffffffff38034080ULL;
while (((0x8000000000000000 & u) != 0) && (cnt < 64)) {
u <<= 1;
cnt++;
}
u >>= cnt;
printf("0x%llx", u);
答案 2 :(得分:0)
我认为如果你想确定它是如何工作的(我假设你这样做是为了练习)也许你可以做一些像:
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]){
long long int i;
unsigned long long u;
long long negative_u;
long long positive_u;
u = 0xffffffff38034080;
memcpy(&negative_u, &u, sizeof(long long int));
positive_u = negative_u * -1;
printf("0x%llx\n", u);
printf("0x%llx\n", negative_u);
printf("0x%llx\n", positive_u);
return 0;
}
现在您应该看到必须更改的字节的确切值,以实现您的目标。
问候!