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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 168, средняя оценка - 4.99
toxxin
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
30.08.2009, 22:17     Тип char.Signed/unsigned.Отличие типов данных. #1
Вопрос немного может быть не туда... Прошу прощения. Пишу прошивку к контроллеру, на С. Интересует отличие типов данных. ДОпустим есть тип char и тип unsigned char. Первый -128...127, а второй 0...255 соответственно. Оба типа занимают 8 бит. В чем разница?? Или разница в обработки типов библиотеками(к примеру) или правильном распозновании например кодировки ASCII ну и т.д. Интересует разница на битовом уровне. Т.е. по идее и там и там 8 бит..

Вопрос появился, когда мне необходимо было считать байт из регистра. Для этого я завел переменную(допустим t) типа char, считал байт. Если я правильно понимаю t фактически это тоже байт памяти, поэтому при считывании регистра в эту переменную t у меня все эти 8 бит просто дублируются. Вопрос что бы изменилось если бы я переменную обозначил типа unsigned char?? И вообще пишут что тип char это символ, а мне не очень понятно ГДЕ/ЧТО/КАК этот символ. И как СИМВОЛ отличается от типа ИНТЕДЖЕР например(кроме того что int - 16 бит)??
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2009, 22:17     Тип char.Signed/unsigned.Отличие типов данных.
Посмотрите здесь:

C++ Signed/Unsigned
C++ Разница между char и signed char
C++ Значения типов данных (signed, unsigned, char)
C++ Надо перевести переменную типа unsigned char* в signed int и обратно
C++ [C++ Warning] Unit1.cpp(24): W8012 Comparing signed and unsigned values
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
31.08.2009, 13:42     Тип char.Signed/unsigned.Отличие типов данных. #21
Цитата Сообщение от RNT Посмотреть сообщение
char != signed char != unsigned char
char==signed char
Какие-то противоречия
В K&R было char==signed char, но, вообще, в компиляторах это зависит от настроек.

О "модуле" целого в 7 битах
- перечитайте собственную цитату, про "модуль" там ни слова!
если знаковое целое из байта, то -1(10)==11111111(bit)

Для будущего программиста, следует иметь более тупой склад мышления и не-придумывать свойств, объектов и параметров, о которых не было речи в документации или техзадании.

Добавлено через 8 минут
Цитата Сообщение от odip Посмотреть сообщение
Во-первых не вижу обещанного long.
Во-вторых не вижу ни одной проблемы.
Явные преобразования типа ведь сделал ?
Ну так значит думал чем-то когда их делал.

Добавлено через 1 минуту
И потом понятно ведь что 254 в signed char ну никак не поместится
- а какая разница long-не-long, главное, что целые больше char
- компилятор тоже проблем не увидит
- главное осознавать действие и понимать
- человек открыл тред с вопросом, ему и объяснили
- а вот у компилятора такого понимания нет
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
АНК
124 / 115 / 2
Регистрация: 27.02.2007
Сообщений: 291
31.08.2009, 13:58     Тип char.Signed/unsigned.Отличие типов данных. #22
Sorry!
RNT
Автор FAQ
 Аватар для RNT
3131 / 351 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.08.2009, 17:02     Тип char.Signed/unsigned.Отличие типов данных. #23
Приведу отрывок из книги Крупника "Изучаем Си", может кому нибудь будет полезно.

Четыре бита, как ни крути, могут находиться лишь в 16 разных
состояниях. Но теперь этим состояниям соответствуют другие
числа. Любопытно, что за семеркой сразу следует –8(1000).
Далее идут –7(1001), -6(1010), -5(1011), и все кончается нулем.
Такой способ кодирования поначалу может показаться
странным, но на самом деле он очень удобен, потому что
позволяет заменить вычитание числа на прибавление такого же
числа, но с противоположным знаком. Например, 5 – 4 = 5+ (–
4)= 0101 + 1100=0001=1. На самом деле, при сложении чисел 5
(0101) и –4 (1100) получается 17, то есть в двоичной записи
10001. Но в нашей переменной всего 4 бита и старшая единица
вытесняется за ее пределы, остается только единица в
младшем разряде. Вот и получается, что 5 + (-4)=1.
Я заметил , что все отрицательные числа начинаются с 1 , а положительные с 0.
Миниатюры
Тип char.Signed/unsigned.Отличие типов данных.  
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
31.08.2009, 17:13     Тип char.Signed/unsigned.Отличие типов данных. #24
RNT, всё правильно. Теперь обратите внимание на то, что назвали "модулем"
Из картинки видно, что ваш "модуль" -8 равен 000 !!!!
RNT
Автор FAQ
 Аватар для RNT
3131 / 351 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.08.2009, 17:16     Тип char.Signed/unsigned.Отличие типов данных. #25
Насчет модуля я выразился некоректно , извиняюсь
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
06.11.2010, 22:45     Тип char.Signed/unsigned.Отличие типов данных. #26
Цитата Сообщение от RNT Посмотреть сообщение
Четыре бита, как ни крути, могут находиться лишь в 16 разных
состояниях. Но теперь этим состояниям соответствуют другие
числа. Любопытно, что за семеркой сразу следует –8(1000).
Далее идут –7(1001), -6(1010), -5(1011), и все кончается нулем.
Такой способ кодирования поначалу может показаться
странным, но на самом деле он очень удобен, потому что
позволяет заменить вычитание числа на прибавление такого же
числа, но с противоположным знаком. Например, 5 – 4 = 5+ (–
4)= 0101 + 1100=0001=1. На самом деле, при сложении чисел 5
(0101) и –4 (1100) получается 17, то есть в двоичной записи
10001. Но в нашей переменной всего 4 бита и старшая единица
вытесняется за ее пределы, остается только единица в
младшем разряде. Вот и получается, что 5 + (-4)=1.
Я бы не много уточнил у добавил, добавлять и вычитать лучше байтами, логическая структура легче вырисовывается, а именно из аналогии работы АЛУ, которое отбрасывает лишний бит не помещающийся в 8 регистр:
5 - 4 = 5 + (-4) ->
0000 0101 +
1111 1100 (дополнительный код для 4)
=
0000 0001

Добавлено через 35 минут
Цитата Сообщение от easybudda Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
/* int vs char */
 
int main(){
    int i = 254;
    signed char sc = (char)i;
    unsigned char uc = (char)i;
    
    printf("i = %d; sc = %d; uc = %d\n", i, sc, uc);
    
    return(0);
}
Код
i = 254; sc = -2; uc = 254
Вот есть код:

C
1
2
3
4
5
6
7
signed char ch=255;
unsigned char uch=255;
int sig_i;
int unsig_i;
 
sig_i = ch;
unsig_i = uch;
возник вопрос какой и куда компилятор устанавливает признак, что для случая
sig_i это будет значение -1 (в двоичной форме .... 1111 1111 1111 1111 1111 1111 1111 1111), а для
unsig_i = 255 (0000 0000 0000 0000 0000 0000 1111 1111), то есть как он решает что в одном случае надо просто нули добавить слева, а в другом единицы?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
07.11.2010, 01:30     Тип char.Signed/unsigned.Отличие типов данных. #27
Цитата Сообщение от norge_goth Посмотреть сообщение
как он решает что в одном случае надо просто нули добавить слева, а в другом единицы?
Почитайте про распространение знака... Если переменная знакового типа signed char "поднимается" к примеру до int или unsigned int, при установленном старшем бите все старшие биты нового значения устанавливаются в 1. Если "поднимается" беззнаковый тип - unsigned char, старшие разряды заполняются нулями.
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
07.11.2010, 14:41     Тип char.Signed/unsigned.Отличие типов данных. #28
Цитата Сообщение от easybudda Посмотреть сообщение
Почитайте про распространение знака... Если переменная знакового типа signed char "поднимается" к примеру до int или unsigned int, при установленном старшем бите все старшие биты нового значения устанавливаются в 1. Если "поднимается" беззнаковый тип - unsigned char, старшие разряды заполняются нулями.
то есть, как я понимаю компилятор ставит какой-то признак что число беззнаковое или знаковое и использует этот признак когда нужно перевести в 10-ную систему счисления?
еще вопрос - этот признак это просто бит? и где он храниться?
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,662
08.11.2010, 09:30     Тип char.Signed/unsigned.Отличие типов данных. #29
Тут некоторые товарищи так уверенно утверждали, что в типе char 8 бит, однако в стандарте размер типа char не закреплен. У Страуструпа сказано только, что «практически всегда на объект типа char отводится 8 бит». Т.е. 8 бит нам никто не гарантировал.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
08.11.2010, 10:22     Тип char.Signed/unsigned.Отличие типов данных. #30
Цитата Сообщение от Mr.X Посмотреть сообщение
8 бит нам никто не гарантировал.
Mr.X, вот по этому Господь дал нам константу CHAR_BIT, определённую в файле limits.h или одном из его включённых файлов
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
08.11.2010, 11:20     Тип char.Signed/unsigned.Отличие типов данных. #31
Цитата Сообщение от norge_goth Посмотреть сообщение
то есть, как я понимаю компилятор ставит какой-то признак что число беззнаковое или знаковое и использует этот признак когда нужно перевести в 10-ную систему счисления?
еще вопрос - этот признак это просто бит? и где он храниться?
Компилятор просто (ну то есть не совсем просто)) гененрирует ассемблерный код, а там уже за знак овечает флаг SF (signed flag) (флаг - это отдельный бит в регистре флагов) и вычесления уже зависят от того - выставлен ли этот флаг. К слову сказать SF устанавливается всегда, когда старший бит равен 1, например:
C
1
2
3
unsigned char a=100;
unsigned char b=28;
unsigned char c=a+b;
результатом будет c=128 (что в двоичном виде 10000000), казалось бы мы оперируем с беззнаковым типом, но флаг SF все равно будет равен 1 (старший бит же 1), т.е. как будто результат "-128" . И тут встает вопрос :" Что за бред, как процессор вообще определяет где число со знаком, а где без?", ответ:" НИКАК"! Процессор вообще не знает, что такое знак числа, он просто вычесляет то, что в него сунули, при этом результат в шестнадцатиричном виде все равно будет правильный как для положительного, так и для отрицательного числа) А для вывода на экран "знаковых отрицательных" чисел используется дополнительный код (за его существование уже ответственен компилятор, который считывает текстовый файл исходника и видит, что число со знаком, и добавляет тот самый код)
Вот, вроде объяснил) Если что не понятно, спрашивайте!

Добавлено через 5 минут
про дополнительный код:
не буду приводить код на АСМе, вот его суть на C :
C
1
2
3
4
// на это месте уже программа уже знает, что речь идет о "знаковом" числе
if (SF==1)
   printf("-");
//а далее простой перевод из HEX в DEC
т.е. знак "-", который мы видем на экране - это всего лишь отдельно напечатанный символ '-' и не более того.
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,662
08.11.2010, 15:13     Тип char.Signed/unsigned.Отличие типов данных. #32
Цитата Сообщение от easybudda Посмотреть сообщение
Mr.X, вот по этому Господь дал нам константу CHAR_BIT, определённую в файле limits.h или одном из его включённых файлов
Значение CHAR_BIT зависит от реализации. Во многих источниках сказано, что это значение не может быть меньше восьми, но в стандарте C++ я что-то никаких упоминаний о значении CHAR_BIT не нашел.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
08.11.2010, 15:17     Тип char.Signed/unsigned.Отличие типов данных. #33
Цитата Сообщение от Mr.X Посмотреть сообщение
Значение CHAR_BIT зависит от реализации. Во многих источниках сказано, что это значение не может быть меньше восьми, но в стандарте C++ я что-то никаких упоминаний о значении CHAR_BIT не нашел.
Как собственно никто и не говорил, что в байте 8 бит. Аналогично то есть.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
08.11.2010, 17:04     Тип char.Signed/unsigned.Отличие типов данных. #34
Цитата Сообщение от Mr.X Посмотреть сообщение
Значение CHAR_BIT зависит от реализации.
Ну да. Вот по этому лучше использовать его, если есть сомнения по поводу количества бит в байте.
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
08.11.2010, 18:56     Тип char.Signed/unsigned.Отличие типов данных. #35
Цитата Сообщение от Kastaneda Посмотреть сообщение
А для вывода на экран "знаковых отрицательных" чисел используется дополнительный код (за его существование уже ответственен компилятор, который считывает текстовый файл исходника и видит, что число со знаком, и добавляет тот самый код)
спасибо вам большое все ясно даже вопросов не осталось, из понятого для себя псевдокод составил, буду рад если вы поправите если что не так :
ch = word_1 + word_2 =>

C
1
2
3
4
5
6
7
8
9
10
11
if (word_1 < 0) доп.код(word_1); // если перед числом есть минус берем доп.код
if (word_2 < 0) доп.код(word_2); // если перед числом есть минус берем доп.код
ch = word_1 + word_2;
if (Type(ch) == signed) {
      if (SF == 1) {
             printf("-");
             printf(toDec(доп.код(ch)));
      }
      else printf(toDec(ch));
}
else printf(toDec(ch));
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
09.11.2010, 10:51     Тип char.Signed/unsigned.Отличие типов данных. #36
Цитата Сообщение от norge_goth Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
if (word_1 < 0) доп.код(word_1); // если перед числом есть минус берем доп.код
if (word_2 < 0) доп.код(word_2); // если перед числом есть минус берем доп.код
ch = word_1 + word_2;
if (Type(ch) == signed) {
      if (SF == 1) {
             printf("-");
             printf(toDec(доп.код(ch)));
      }
      else printf(toDec(ch));
}
else printf(toDec(ch));
Нет, не так. Доп.код про который я писал нужен лишь для вывода числа на экран (ну или куда там). Соответственно в этих строках он не нужен:
C
1
2
if (word_1 < 0) доп.код(word_1); // если перед числом есть минус берем доп.код
if (word_2 < 0) доп.код(word_2); // если перед числом есть минус берем доп.код
два байта и так правильно суммируются, не зависимо от знака (точнее они вообще знака не имеют, об этом писалось выше)
C
1
2
3
4
5
if (Type(ch) == signed) {
      if (SF == 1) {
             printf("-");
             printf(toDec(ch));//почему у вас тут было написано доп.код??
      }
может вы не совсем поняли что есть доп.код?
вот как это выгдядет на ассемблере (создатели компиляторов закладывают подобный код для вывода чисел, ну может более проффесионально написан, хотя этот тоже не плох)
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
OutInt proc
        
;; Проверяем число на знак.
       test    ax, ax
       jns     oi1 ; если флаг SF равен 0, то прыг на метку oi1
 
;; Если оно отрицательное, выведем минус и оставим его модуль.
       mov  cx, ax
       mov     ah, 02h
       mov     dl, '-'  ; Вот о чем я говорил, символ '-' печатается отдельно 
                        ;и не имеет отношения  к самому числу
       int     21h
       mov  ax, cx
       neg     ax
;; Количество цифр будем держать в 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
 
OutInt endp 
 
;код взят здесь : [url]http://www.cyberforum.ru/assembler/thread54461.html[/url]
Автор кода (Goodwin98) по-моему достаточно прокоментировал его, даже не зная АСМа можно понять логику его работы, я там только пару своих коментариев добавил. (строка 5,10)
Если еще остались вопросы - спрашивайте, отвечу (если смогу)))
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
09.11.2010, 21:09     Тип char.Signed/unsigned.Отличие типов данных. #37
Цитата Сообщение от Kastaneda Посмотреть сообщение
может вы не совсем поняли что есть доп.код?
немного запутался... давайте по порядку задачу разделим на 2 этапа:
1. это получение числа (например ch = -20 - 30)
2. вывод на экран

1. я так понимаю все сводиться к прибавлению и мы получаем
ch = -20 + (- 30) и АЛУ выполняет вот такие действия
ch = 11101100(-20 в доп. коде) + 11100010(-30 в доп. коде) я правильно понимаю?

и в итоге на выходе процессора мы получаем 11001110
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
10.11.2010, 14:33     Тип char.Signed/unsigned.Отличие типов данных. #38
Цитата Сообщение от 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, то будет сгенерирован только код получения числа (без проверки на знак) и выводом его на экран. Таким образом будет выведен правильный ответ!
Вроде объяснил
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
10.11.2010, 18:52     Тип char.Signed/unsigned.Отличие типов данных. #39
Такой вопрос:

В первом случае(1) печатается символ, а во втором(2) код символа.
Что в данном случае означает unsigned?

C++
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
29
30
31
32
33
34
35
36
37
38
39
#pragma once
#include <iostream>
using namespace std;
class Bin
{
    unsigned char Bxbit1:1;  //        (1)
        //и т.д.
        
       //unsigned Bxbit1:1;         //        (2)
    
public:
    void ShowBin(void)
        {
       cout<<Bxbit1<<endl;
    }
};
class Hex
{//код
};
class Oct
{
//код
};
union MyByte
{
    unsigned char c;
    Bin b;
    Hex h;
    Oct o;
    MyByte(char x);
};
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    MyByte byte(0x1f);
    byte.b.ShowBin();
    return 0;
}//endmain
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2010, 19:55     Тип char.Signed/unsigned.Отличие типов данных.
Еще ссылки по теме:

C++ 8-битовый тип signed char может представлять значения от -128 до 127
C++ Comparison between signed and unsigned integer expressions
C++ Приведение типов unsigned char[2] to unsigned char [64]

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

Или воспользуйтесь поиском по форуму:
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
10.11.2010, 19:55     Тип char.Signed/unsigned.Отличие типов данных. #40
Цитата Сообщение от st_dent Посмотреть сообщение
Что в данном случае означает unsigned?
дело в том если unsigned то все символы будут попадать в диапазон 0..255, а если signed то если вывести код символа(сконвертировать в инт
или Сишный printf("%d", ch)), то символы код которых больше 127 будут отрицательными -128..127
еще важный момент - помните что char это фактически однобайтовый int и символы храняться в нем в виде кодов(в кодировке ASCII)

Добавлено через 12 минут
Вопрос по вашему коду, что это за объявление? то есть что это символ/код
Цитата Сообщение от st_dent Посмотреть сообщение
unsigned char Bxbit1:1
Добавлено через 11 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение
Вроде объяснил
все понятно спасибо вам большое за терпение
над наверно с асмом побаловаться чтоб меньше таких вопросов стояло
Yandex
Объявления
10.11.2010, 19:55     Тип char.Signed/unsigned.Отличие типов данных.
Ответ Создать тему
Опции темы

Текущее время: 10:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru