Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Assassin1307199
0 / 0 / 0
Регистрация: 26.06.2013
Сообщений: 16
1

Что выведет на консоль следующий фрагмент кода

05.01.2014, 00:17. Просмотров 1458. Ответов 6
Метки нет (Все метки)

$11. Что выведет на консоль следующий фрагмент кода: (обоснуйте ответ)
unsigned char a = 255;
char b = a;
printf("%d\n", b);
а) 255
б) -1
в) d


выводит -1 не пойму почему... обьясните плиз...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2014, 00:17
Ответы с готовыми решениями:

Что делает приведенный фрагмент кода
Что делает следующий фрагмент кода и почему? void foo(void) { unsigned int a = 6; int b...

Что выведет следующий фрагмент программы и почему?
double a = 0.3, b = 5.1; if (5.4 == a + b) cout « "равно"; else cout « "не равно"; При...

Что выведет следующий код написанный на Java?
Всем привет! Я с синтаксисом Java не знакома, знакома только с С++, хотелось бы понять алгоритм...

Что выведет следующий класс при запуске?
Все добрый день! Готовлюсь к OCA, в процессе попалась такая задачка What will the following...

Что выведет на экран следующий элемент программы, и сколько раз выполнится цикл?
Определить , что выведет на экран следующий элемент программы и сколько раз выполнится цикл...

6
Fonduee
Музыка нас Связала
230 / 230 / 52
Регистрация: 26.03.2008
Сообщений: 616
05.01.2014, 00:57 2
Цитата Сообщение от Assassin1307199 Посмотреть сообщение
выводит -1 не пойму почему... обьясните плиз...
1 char = 1 байт = 8 бит

Тип переменной а не просто char, а unsigned char (беззнаковый) т.е. есть только позитивные числа. Максимальное число, которые можно представить 8 битами - это 255 (наше число, о, мистика) или 11111111 (в двоичном виде)

Переменая b имеет тип char т.е. можно сохранять в нем и негативные числа (наивысший бит указывает какое число мы имеем, позитивное или негативное). Есть много способов для этого, но наиболее распространенным будет Two’s complement (Дополнительный код). Значит нужно отнять 1 и результат инвертировать:

11111111 - 1 = 11111110 -> 10000001 (наивысший бит указывает на то, что число негативное) = -1
1
gray_fox
What a waste!
1557 / 1262 / 166
Регистрация: 21.04.2012
Сообщений: 2,641
Завершенные тесты: 3
05.01.2014, 00:59 3
Если считать, что в байте 8 бит, то у char диапазон значений [-128; 127]. Т.е. с помощью char 255 представить нельзя, и, насколько я помню, что именно в строке с присвоением будет происходить зависит от реализации компилятора. Скорее всего так: 255 - это 11111111; если рассматривать это как доп. код (отрицательные числа хранятся в таком виде), то это -1.
1
kazak
3061 / 2382 / 255
Регистрация: 11.03.2009
Сообщений: 5,440
Завершенные тесты: 1
05.01.2014, 02:55 4
Цитата Сообщение от Assassin1307199 Посмотреть сообщение
Что выведет на консоль следующий фрагмент кода: (обоснуйте ответ)
Вообще ожидается "мусор". Т.к.
Цитата Сообщение от Assassin1307199 Посмотреть сообщение
printf("%d\n", b);
компилятору указываем, что выводить на экран будем знаковое целое число (int, по умолчанию 4 байта), а передаем char (1 байт). А то, что некоторые Intel'ие компиляторы при передаче параметра, сохраняют байт в 32-битном регистре с заполнением старших разрядов знаковым битом и сбрасывают в стек весь регистр, так это скорее исключение из правил.
0
Charles Kludge
Клюг
7647 / 3162 / 383
Регистрация: 03.05.2011
Сообщений: 8,382
05.01.2014, 13:39 5
Watcom выдаёт 255, даже понятно почему:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
; #include <stdio.h>
; void main(void)
main:
    push        0ffH 
    push        offset FLAT:L$1 
    call        near ptr FLAT:printf 
    add         esp,8 
 
; {
; unsigned char a = 255;
; char b = a;
; printf("%d\n", b);
; };
    ret         
L$1:
    DB  25H, 64H, 0aH, 0 ; db '%d\n',0
0
Fonduee
Музыка нас Связала
230 / 230 / 52
Регистрация: 26.03.2008
Сообщений: 616
05.01.2014, 14:19 6
Цитата Сообщение от Charles Kludge Посмотреть сообщение
Watcom выдаёт 255, даже понятно почему:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
; #include <stdio.h>
; void main(void)
main:
    push        0ffH 
    push        offset FLAT:L$1 
    call        near ptr FLAT:printf 
    add         esp,8 
 
; {
; unsigned char a = 255;
; char b = a;
; printf("%d\n", b);
; };
    ret         
L$1:
    DB  25H, 64H, 0aH, 0 ; db '%d\n',0
Каждый компайлер оптимирует под себя, но в большинстве случает будет -1.
0
Charles Kludge
Клюг
7647 / 3162 / 383
Регистрация: 03.05.2011
Сообщений: 8,382
05.01.2014, 14:37 7
Fonduee, в Ваткоме это зависит от ключика, по умолчанию char беззнаковый. Теперь выдаёт -1:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
; #include <stdio.h>
; void main(void)
main:
    push        0ffffffffH 
    push        offset FLAT:L$1 
    call        near ptr FLAT:printf 
    add         esp,8 
 
; {
; unsigned char a = 255;
; char b = a;
; printf("%d\n", b);
; };
    ret
Так что верны два первых варианта ответа - препода можно поподкалывать.
1
05.01.2014, 14:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2014, 14:37

Что выведет на экран следующий элемент программы и сколько раз выполнится цикл
int y = 0; int k = 3; do { k = k * 2; y = y + k; } while (k &lt; 7);...

Что выведет на экран следующий элемент программы и сколько раз выполнится цикл
int y = 0; int k = 4; while (k &gt; 1 ){ y = y + 1 / k; k = k - 1; }...

Что выведет на консоль программа?
Добрый день Подскажите пожалуйста , что выведет следующий код: public class Test { public...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru