2016-10-14 3 views
0

У меня есть какое-то отрицательное значение, для которого мне нужно эквивалентное положительное значение. Я добавляю MAX + 1 к этому значению, где MAX - это максимальное значение, которое может быть представлено с таким количеством бит, мы можем решить эту проблему. Но это не помогло. Например, пожалуйста, ознакомьтесь со следующим кодом:конвертировать подписанное значение без знака в C

#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

'0xffffffff38034080' - положительное шестнадцатеричное число. Что вы ожидаете? – mch

+0

Я хочу преобразовать 0xffffffff38034080 -> 0x0000000038034080 –

+1

, вы просто спровоцируете переполнение, а затем вы находитесь на том же самом числе. Вы можете умножить на -1 или инвертировать его с помощью '~' и добавить 1, я думаю, или использовать битоперации типа '&' –

ответ

4

Я думаю, что вы ищете в 2 дополнением:

{ 
    unsigned long long u; 

    u = 0xffffffff38034080; 

    u = ~u + 1; 

    printf("0x%llx", u); 
} 
+0

Вы запустили это? Результат неверен. Он выводит '0xc7fcbf80'. – dbush

+0

Вопрос включал «Мне нужно эквивалентное положительное значение». Отрицательные значения обрабатываются как мой пример, и эквивалентное положительное значение битового шаблона '0xffffffff38034080' равно' 0xc7fcbf80'. Этот результат правильный. Если что-то еще имелось в виду, вопрос недостаточно точен. Преобразование в '0x0000000038034080', как указано OP, не имеет смысла без дополнительной информации. Это не то, как работают процессоры. –

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); 
+0

Это то, что я ищу, но можем ли мы сделать макрос или более простой способ сделать это? –

+0

@HimanshuDutta Просто чтобы уточнить, вы уверены, что это то, что вы хотите? Значение '0xffffffff38034080' интерпретируется как отрицательное число в десятичной форме:' -3355230080', а '0x38034080' в качестве положительного числа в десятичном -' 939737216'. И наоборот, '0xc7fcbf80' как положительное десятичное значение -' 3355230080'. – dbush

+0

Да. Это немного дополняет 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; 
} 

Теперь вы должны увидеть точные значения байтов, которые вы должны изменить, чтобы достичь того, что вы ищете.

С уважением!

+0

выход: '0xffffffff38034080 0xffffffff38034080 0xc7fcbf80' –

+0

Теперь точно можно сказать, Крис Tophski был совершенно верно;) – Whitefield

+0

@HimanshuDutta Я не понимаю, если вы удовлетворены или нет. Chris Tophski абсолютно прав, если вы хотите сменить знак, вы должны рассчитать дополнение 2 и добавить 1. Результат - это то, что вы видели (0xc7fcbf80), и это очевидно в моем коде. Очевидно, вы должны рассмотреть 0x00000000c7fcbf80 – Whitefield

Смежные вопросы