- •Действия: что делает программа Глава 2 Выражения
- •Арифметические операторы
- •Замечание
- •Операторы отношений
- •Логические операторы
- •Оператор отрицания
- •Операторы инкремента и декремента
- •Поразрядные операторы
- •Поразрядный оператор исключающего или
- •Сдвиг битов влево
- •Дополнение до единицы
- •Сомр 44 0х002с 0000000000101100
- •Операторы присваивания
- •Выражения значений
- •Приоритеты операторов
Дополнение до единицы
Оператор поразрядного дополнения до единицы, представленный символом ~ (в математике тильда - символ разности), переключает все биты значения с 1 на 0 и с 0 на 1. Дополнение до единицы является унарным оператором, который предшествует своему операнду подобно унарному плюсу или минусу (как в выражениях -34 или +value).
Используйте унарную операцию дополнения до единицы для выполнения поразрядного отрицания двоичных значений. Например, выражение
А = ~В
присваивает переменной А значение дополнения или отрицания переменной В.
Листинг 2.9 демонстрирует оператор поразрядного дополнения до единицы. Введите и запустите программу, затем введите одно число, чтобы получить значение его дополнения.
Листинг 2.9. ТСОМР.С (поразрядное дополнение до единицы)
_____________________________________________________
1: #include <stdio.h>
2: #include "pbin.c"
3:
4: main()
5: {
6: unsigned int v1, v2;
7:
8: printf("Enter value to complement: ");
9: scanf("%u", &v1);
10: v2 = ~v1;
11: printf(" %5d %#06x ", v1, v1); pbin(v1);
12: printf( “====================================\n");
13: printf("COMP %5d %#06x ", v2, v2); pbin(v2);
14: return 0;
15: }
_______________________________________________________
Дополнение до единицы - это обычная операция низкого уровня, которую большинство компьютерных процессоров выполняет в мгновение ока. Являясь двоичной логической операцией, дополнение до единицы имеет два назначения: инвертирование значений "истина" и "ложь", а также преобразование отрицательных значений в положительные и наоборот.
Если 0 представляет "ложь", то -0 является "истиной", так как отрицание нуля дает -1 (беззнаковое число 65535), а любое ненулевое число означает "истину". (Чтобы убедиться в этом, запустите ТСОМР и введите 0.) Обратное утверждение также справедливо: отрицание -1 равно 0. Однако отрицание не каждого ненулевого числа дает 0.
Кроме этого, операция дополнения до единицы играет роль в преобразовании отрицательных и положительных целых. Прибавление единицы к результату выражения дополнения до единицы формирует другое значение, называемое дополнением до двух. Посмотрите на следующий результат работы программы:
-49 0xffd3 1111111111010011
=========================
Сомр 44 0х002с 0000000000101100
Очевидно, что 44+1 равно 45 - абсолютному значению числа -45 (беззнаковый эквивалент). Затем введите число 45 и получите другой результат:
45 0x002d 0000000000101101
=================================
СОМР -46 0xffd2 1111111111010010
Прибавление 1 к числу -46 дает первоначальное значение –45.
Один плюс дополнение до единицы любого знакового целого v равно тому же самому значению с противоположным знаком.
Рис. 6.6 иллюстрирует действие оператора дополнения до единицы, примененного к двоичному значению 00101100. Сравните биты 2-5 на этом рисунке с примером исключающего ИЛИ на рис. 2.3. Выполнение исключающего ИЛИ над некоторым битом и единичным битом переключает значение первого бита (то же самое делает операция дополнения до единицы); эту важную связь следует запомнить. Например, операция исключающего ИЛИ с операндами 00101100 и 11111111 даст тот же результат, что и выражение -00101100.