Трудность понимания подписана не - PullRequest
0 голосов
/ 14 марта 2019

Мне трудно понять, почему c равно -61 в следующей программе:

   main() {
       unsigned int a = 60;     // 60 = 0011 1100   
       unsigned int b = 13;     // 13 = 0000 1101
       int c = 0;           
       c = ~a;          //-61 = 1100 0011
       printf("Line 4 - Value of c is %d\n", c );
   }

Я понимаю, как работает оператор NOT на 0011 1100 (решение - 1100 0011).Но я не уверен, почему десятичное число увеличивается на 1. Это какое-то преобразование типа из unsigned int (из a) в sign int (из c)?

1 Ответ

2 голосов
/ 14 марта 2019

Преобразование из положительного числа в отрицательное в дополнение к двум (стандартный формат со знаком) представляет собой побитовую инверсию и добавление единицы.

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

So if 60 = 0011 1100
Then c   = 1100 0011 + 1
         = 1100 0100

А для подписанного байта самый старший бит отрицателен, так что

c = -128 + 64 + 4 = -60

Вам необходимо добавить 1, чтобы учесть тот факт, что самый старший бит равен -128, а наибольшее положительное число - 0111 1111 = 127. У всех отрицательных чисел есть 1 для -128, которое необходимо сместить.

Это легко увидеть, когда вы смотрите на преобразование 0 в -0. Инвертируйте 00000000, и вы получите 11111111, а при добавлении одного вы вернетесь к 00000000. Сделайте то же самое с 1 по -1, и вы получите 11111111 - максимально возможное отрицательное число.

...