在C中将signed转换为无符号值

时间:2016-10-14 12:20:46

标签: c unsigned signed

我有某种负值,我需要等效的正值。我将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

3 个答案:

答案 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;
}

现在您应该看到必须更改的字节的确切值,以实现您的目标。

问候!