Форум программистов, компьютерный форум CyberForum.ru

Тип char.Signed/unsigned.Отличие типов данных. - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Контейнеры в Windows http://www.cyberforum.ru/cpp-beginners/thread48852.html
Привет.На лето в институте задавали как практику написать приложение с 2мя контейнерами.Мне попалось со списками.Так вот , условиям выбра во 2ой контейнер данных из 1го является - четность.А я убей не помню, как четные числа выводить...((Помогите плиз)
C++ Ошибка времени выполнения Я пишу проэкт в Visual Studia 2008 на C++. У меня есть несколько проблем. Во-первых, когда я собираю финальную версию (release) и запускаю не выполнение, то появляется ошибка: Unhandled exception at 0x00402330 in chtml.exe: 0xC0000005: Access violation reading location 0x00000000. вот в этом месте int main( int argv, char *argc ) { #if ! LINUX setlocale( LC_ALL, ".1251" ); #endif... http://www.cyberforum.ru/cpp-beginners/thread48827.html
C++ Массивы (С++)
Здраствуйте помогите решить задачку на С++, задача простая а обращаюсь к вам потомучто совсем не знаком с этим языком сформировать массив С из нечетных и массив К - из четных чисел последовательности N(m)={10, 8, 4, 3, 6, 15, 2}, m=7. заранее очень благодарен
подскажите мне соответствующую книгу C++
френды,вот в чем загвоздка я не люблю читать литературу с компа,например в форматах pdf или ещё хуже DJVU у меня просто не приспособлены для этого мозги...я люблю читать реальные книги на бумаге...это уже научно доказано,что такая литература лучше усваивается,нежели литература с компа я прочитал в бумажном варианте книгу Стивена Холзнера Самоучитель Visual c++.Учебный курс книга...
C++ Что означают параметры %d, %s, %f и т.д.? http://www.cyberforum.ru/cpp-beginners/thread48806.html
Появилась проблема с выводом переменных в MessageBox. В MSDN нарыл это: #include <stdio.h> int main( void ) { char buffer, s = "computer", c = 'l'; int i = 35, j; float fp = 1.7320534f;
C++ Задача "Кузнечик" Помогите решить в С++ задачу про цифрового кузнечика: имеется линейный массив из 20 чисел 1,2,3,4...20. По нём может прыгать кузнечик скачками по 2 и по 3 клетки. Нужно создать программку, которая считает сколько есть вариантов у кузнечика попасть из клетки 0 на клетку 20. Использовать цикл "for"... подробнее

Показать сообщение отдельно
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
10.11.2010, 14:33     Тип char.Signed/unsigned.Отличие типов данных.
Цитата Сообщение от norge_goth Посмотреть сообщение
немного запутался... давайте по порядку задачу разделим на 2 этапа:
1. это получение числа (например ch = -20 - 30)
не совсем понял, что имелось ввиду, все вычесления производятся там, где они есть в сишном коде, вышепреведенный код используется только для вывода числа на печать.
ch = 11101100(-20 в доп. коде) + 11100010(-30 в доп. коде) я правильно понимаю?

и в итоге на выходе процессора мы получаем 11001110
тут тоже не понял, что значит "(-20 в доп. коде) ", что вы подразумеваете под доп.кодом?
Давайте сначала: речь изначально шла о знаковых/беззнаковых типах. Так вот - таких типов нет, они существуют только в контексте языков C/C++ (ну о других мы сейчас просто не говорим), в действительности же их нет. В языках C/C++ это просто условность для удобства работы программиста (ну и потому что программист не имеет контроля над процессом вывода на устройство вывода)
Таким образом вот этот код:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
;; Количество цифр будем держать в CX.
;oi1:  
        xor     cx, cx
        mov     bx, 10 ; основание сс. 10 для десятеричной и т.п.
oi2:
        xor             dx,dx
        div     bx
; Делим число на основание сс. В остатке получается последняя цифра.
; Сразу выводить её нельзя, поэтому сохраним её в стэке.
        push    dx
        inc     cx
; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
        test    ax, ax
        jnz     oi2
; Теперь приступим к выводу.
        mov     ah, 02h
oi3:
        pop     dx
; Извлекаем очередную цифру, переводим её в символ и выводим.
 
        add     dl, '0'
        int     21h
; Повторим ровно столько раз, сколько цифр насчитали.
        loop    oi3
        
        ret
подставляется всегда, когда нужно вывести число на экран, если же компилятор увидит в сишном исходнике, что речь идет о "знаковых" типах, то плюс к этому коду он еще добавит вот этот:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
;; Проверяем число на знак.
       test    ax, ax
       jns     oi1 ; если флаг SF равен 0, то прыг на метку oi1
 
;; Если оно отрицательное, выведем минус и оставим его модуль.
       mov  cx, ax
       mov     ah, 02h
       mov     dl, '-'  ; Вот о чем я говорил, символ '-' печатается отдельно 
                        ;и не имеет отношения  к самому числу
       int     21h
       mov  ax, cx
       neg     ax
этот код нужен только для печати числа, для математических операций он не нужен, в шестнадцатиричном виде (которым оперирует ассемблер) и так посчитает все правильно, например:
C
1
int result = 30 - (-40);
вот число со знаком, и кажется,что компилятор должен обработать эту строку и в соответствии с правилами математики нужно поменять операцию с '-' на '+' и поменять знак второго операнда, но этого не будет, числа останутся в таком виде в каком есть
Код
30 = 1E (в шестнадцатиричном виде)
-40 = D8 (как и 216(dec)=D8(hex))
result = 1E - D8
вот тут может закипеть мозг, ведь 30-(-40) это 70, а 30-216 это -186. И как процессор должен понять, какой ответ ему нужен??? НИКАК
резюмируем вышесказнное
Код
имеем 30 - (-40) = 70
еще 30 - 216 = -186
эти две строки выглядят одинаково в шестнадцатиричном виде 1E - D8 = 46 

проверяем ответ:
 70 dec = 46 hex
-186 dec = 46 hex
ответ правильный для любых чисел (-40 или 216)
далее в сишном коде например
C
1
printf("&d",result);
так какой же ответ вывести? Очень просто, если result объявлен как int (что по умолчнию подразумевает signed), то числа 30 и -40 будут итерпретироватся как числа со знаком, и для вывода будет сгенерирован весь показный выше асемблерный код (т.е. с проверкой на знак и выводом символа '-' если нужно), если же result был объявлен как unsigned int, то будет сгенерирован только код получения числа (без проверки на знак) и выводом его на экран. Таким образом будет выведен правильный ответ!
Вроде объяснил
 
Текущее время: 12:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru