Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тест_7_л_2_7.doc
Скачиваний:
1
Добавлен:
24.08.2019
Размер:
280.58 Кб
Скачать

11111-правильно без вариантов!!!!!!!!!!!!!!!!!!!

22222-фэил!!!!!!!!

33333-херня!

2&123=2

~11= -12

~78=-79

~-5=4

__________________________________________________________________________________________________________________________________________________________________________________________

В заданиях теста оператору printf ("%d\n", выражение); соответствует оператор cout << int (выражение) << endl; при спецификаторе %d и

cout << unsigned (выражение) << endl; при спецификаторе %u

printf ("%d\n", char(2&123));  cout << int (char (2&123)) << endl;

здесь: исходный типchar; тип преобразованияint;

printf ("%u\n", char(2&123));  cout << unsigned(char (2&123)) << endl;

здесь: исходный типchar; тип преобразованияunsigned;

Алгоритм преобразования типов:

  • выполняем указанную операцию и получаем логическое представление значения результата в количестве байтов, соответствующих заданному исходному типу;

  • расширяем представление числа до количества байт, определяемых типом преобразования; при этом:

    • если исходный тип числа знаковый (char, short, int,…), то представление числа расширяется знаковым битом (единицей или нулем);

    • если исходный тип числа беззнаковый (unsigned char, unsigned short, …), то представление числа всегда расширяется нулем;

  • дальнейшая интерпретация полученного логического представления значения результата зависит от типа преобразования:

    • для беззнакового – число вычисляем по его развернутой записи: 1*2i + …

    • для знакового типа:

      • если знаковый бит равен 0, то число положительное и получаем его значение по развернутой записи: 1*2i + …

      • если знаковый бит равен 1, то число отрицательное и получаем значение его модуля обычным образом (инверсия, затем +1, а затем приписываем знак - )

Пример 1:

cout << int (char (2&123)) << endl;

  1. 2&123= 2; логическое представление значения для исходного типа char: 000000102

  2. так как исходный тип char знаковый, а число положительное, то расширяем представление нулем

  3. для типа преобразования int имеем: 00000000 00000000 00000000 00000010

4. тип преобразования int – знаковый, знаковый бит содержит 0, значит число положительное и равно 2.

cout << unsigned(char (2&123)) << endl;

  1. 2&123= 2; логическое представление значения для исходного типа char: 000000102

  2. Так как исходный тип char знаковый, а число положительное, то расширяем представление нулем

  3. для типа преобразования unsigned имеем: 00000000 00000000 00000000 00000010

  4. тип преобразования unsigned – беззнаковый, число равно 2

cout << int (unsigned char (2&123)) << endl;

  1. 2&123= 2;  логическое представление значения для исходного типа unsigned char: 000000102

  2. так как исходный тип unsigned char беззнаковый, то расширяем представление нулем

  3. для типа преобразования int имеем: 00000000 00000000 00000000 00000010

  4. тип преобразования int – знаковый, знаковый бит содержит 0, значит число положительное и равно 2.

Пример 2:

cout << int (char (~11)) << endl;

1. ~11= -12; логическое представление значения для исходного типа char: 111101002

2. так как исходный тип char знаковый, и число отрицательное, то расширяем представление единицей

3. для типа преобразования int имеем: 11111111 11111111 11111111 11110100

4. тип преобразования int – знаковый, знаковый бит содержит 1, значит число отрицательное и получим его модуль: 00000000 00000000 00000000 00001011 +1=00000000 00000000 00000000 00001100 2 = -12

cout << unsigned (char (~11)) << endl;

1. ~11= -12; логическое представление значения для исходного типа char: 111101002

2. так как исходный тип char знаковый, и число отрицательное, то расширяем представление единицей

3. для типа преобразования unsigned имеем: 11111111 11111111 11111111 11110100

4. тип преобразования unsignedбеззнаковый, значит число положительное и получим его значение по развернутой форме записи: 11111111 11111111 11111111 111101002 = 4294967284

cout << int (unsigned char (~11)) << endl;

1. ~11= -12; логическое представление значения для исходного типа unsigned char: 111101002

2. так как исходный тип unsigned char беззнаковый, то расширяем представление нулем

3. для типа преобразования int имеем: 00000000 000000000 00000000 11110100

4. тип преобразования int – знаковый, знаковый бит содержит 0, значит число положительное и получим его значение по развернутой форме записи: 00000000 00000000 00000000 11110100=244

Гр.1____________________________________________________________________________________________________________________________________________________________________________________

  1. Результат выполнения оператора

printf ("%d", char(2&123)); 2

и его обоснование:

1. 2 2. -13 3. 4294967293

4. исходное представление значения выражения (для знакового типа) «расширяется» знаковым битом, который в данном представлении числа есть 0

5. исходное представление значения выражения (для знакового типа) «расширяется» знаковым битом, который в данном представлении числа есть 1 6. исходное представление значения выражения (для беззнакового типа) «расширяется» нулем, независимо от значения знакового бита в представлении 7. единицу в знаковом разряде итогового логического представления числа спецификатор d интерпретирует как «минус»

8. единицу в знаковом разряде итогового логического представления числа спецификатор u интерпретирует как его значение 9. исходное логическое представление выражения занимает 1 байт 10. исходное логическое представление выражения занимает 4 байта

11. итоговое логическое представление выражения занимает 1 байт 12. итоговое логическое представление выражения занимает 4 байта

13. 0 в знаковом разряде итогового логического представления числа спецификатор d интерпретирует как «плюс»

14. вычисляем значение числа

15. 3

16. -14