Попытка преобразовать значение в дополнение 2s в C - PullRequest
1 голос
/ 15 мая 2019

Я пишу эмулятор на C, и я хочу сделать constantValuable, который равен 65530 (0xFFFA), как переменную дополнения к двум из 5, но я не могу понять, что это правильно. Ниже приведен пример оператора if, где я хотел бы, чтобы это было сделано.

if(opCodeType == 4)
            {
                if(registers[rsVariable] == registers[rtVariable])
                {
                    int twosVariable = ~(constantVariable) + 1;
                    printf("%d", twosVariable);
                    pc = pc + (twosVariable*4);
                }
            } 

Я не могу понять, почему это не работает.

1 Ответ

3 голосов
/ 15 мая 2019

Действительно, дополнение 2 таково, что дополнение к вашему номеру n (которое алгебраически равно -n) получается из , отражающего битовую комбинацию n с последующим добавлением 1 к этому числу. Обратите внимание, что в схеме дополнения 2 все биты -1 установлены на 1.

Проблема с отражением битового шаблона с использованием ~ заключается в том, что он может вызвать нежелательное продвижение типа, что портит результат.

Одно из решений - замаскировать результат ~, другое - разыграть результат. Конечно, на платформе дополнения 2 вы можете просто написать -n, следя за тем, чтобы n уже не был наименьшим отрицательным.

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