powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
25 сообщений из 262, страница 3 из 11
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38638413
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryК чему это было смешивать. Было бы так char-символьный, u/s char -целый. А тут получается что u/s char принадлежит двум пространствам. Это мне не нравится. Тогда какой смысл в этом выделении plain char. Да и вообще двусмысленность получается. Может быть я что-то не так понял..Исторически сложилось.
US-ASCII - семибитный код. В асинхронных коммуникация размер символа можно было регулировать. В частности, можно было передавать семибитный код и, дополнительно, бит чётности, который использовала аппаратура.
На прикладном уровне получался "свободный" старший бит и вопрос его интерпретации отдавался на откуп разработчиков системы.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38638684
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё-равно, не понятно, почему в стандарте в одном абзаце char обзывают целочисленным, а в другом символьным
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38638702
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВсё-равно, не понятно, почему в стандарте в одном абзаце char обзывают целочисленным, а в другом символьнымПотому, что все кодируют символы целыми числами.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38638715
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov, это логично, это я понимаю. Но что мне выводить с этих 8 бит ? Выводить число, или выводить символ соотвествующий этому числу ? Да, в printf, у меня есть спецификатор, и я укажу что я хочу лицезреть. И всё ?
И в чём тогда разница между char и unsigned char ? Меня спросят-какой тип у char, Саша ? Что я отвечу ? у неё нет строгого типа ?

PS
Теперь я могу не спрашивать даже, очевидно что в Си слабая типизация. Мне кажется это гибко.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38638722
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryИ в чём тогда разница между char и unsigned char ? Меня спросят-какой
тип у char, Саша ? Что я отвечу ? у неё нет строгого типа ?
Отвечай, что существует три разных типа: char, signed char и unsigned char.
Правильные кодеры используют первый для симоволов, а два остальных - для чисел.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38638728
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Объект объявленный как char имеет размер достаточный для хранения basic execution character set. То есть можно утверждать:
char символьный тип.


В С/С++ нет символьных типов вообще. Есть только числа.


2. Не везде char будет занимать 1 байт.(больше предположение)

Вроде как стандарт именно гарантирует, что размер char -- 1 байт.


3.signed char и unsigned char - принадлежат множеству целых типов (standart integer types).

Да

4. Объём памяти выделенный на plain char и u/s char одинаков.

Да

5. char, signed char, unsigned char это разные вещи. И никто из них не может рассматриваться попарно равным.


Не совсем. signed char, unsigned char -- это разные вещи. char -- это тип, совпадающий с одним из двух : либо signed char, либо unsigned char. Каким будет char по умолчанию, возможно, стандарт декларирует, но по факту есть настройки компиляторов, которые делают char по умолчанию signed или unsigned.


6.int=unsigned int, не существует plain int, или plain smth_type кроме char. Хотя в стандарте указывают plain int, я так понял это signed int.

В общем, с int та же история, что и с char. Возможно, что стандарт как-то особо выделяет тип char в этом смысле, но это не очень важно.

Идея в том, что

int == signed int
unsigned == unsigned int
short == signed short
unsigned short == unsigned short

и так далее.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38638732
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

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

Это всё равно, что новичку-скалолазу изучать скалолазание сразу на маршруте 5-ой категории сложности.
Да, если влезешь, то будешь наверное знать всё скалолазание, но вот только не факт, что влезешь.

Начинай с простого.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38638736
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Правильные кодеры используют первый для симоволов"- только я хочу, чтобы это было закреплено в стандарте :( Он получается несовершенным (
Объясните пожалуйста подробней эту историческую особенность.

Basil A. Sidorov Исторически сложилось.
US-ASCII - семибитный код. В асинхронных коммуникация размер символа можно было регулировать. В частности, можно было передавать семибитный код и, дополнительно, бит чётности, который использовала аппаратура.
На прикладном уровне получался "свободный" старший бит и вопрос его интерпретации отдавался на откуп разработчиков системы.

не смог сделать вывод:"char должен быть и символьным и целым". Наверное вы всё корректно объяснили, но мне хватает каких-то фундаментальных знаний для понимания того, что вы хотите донести до меня. Что он ASCII 7-битный был, знал
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38638751
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryне смог сделать вывод:"char должен быть и символьным и целым".

char - символьный. Остальные - целые. НО! Между ними разрешено неявное преобразование.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38638801
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, правильнее думать, что в С нет вообще символьных типов.
И в принципе так оно и есть -- специальных символьных операций в языке нет, а с char допустимы все арифметические операции.

символьный тип же введён видимо в стандарт только для обозначения char-а.

SashaMercury, есть такая книга:

http://www.ozon.ru/context/detail/id/5637788/

Это по сути пересказ стандарта языка С на нормальном языке. Если уж так серьёзно погружаться хочешь в язык, рекомендую её читать.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38638827
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я учту все мнения, спасибо :) Думаю, в дальнейшем некоторые вещи прояснятся сами.

MasterZiv, пытался пользоваться функцией fopen, пришлось искать её в стандарте, наткнулся на незнакомый идентификатор в её прототипе-restrict, потому пришлось сначала изучить типы данных, затем разберусь с restrict, затем с fopen, а затем уже поcчитаю пробелы и знаки табуляции в 1.txt.

PS Мне думается что любой тип данных, по сути, числовой, в любом языке программирования
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38638889
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryPS Мне думается что любой тип данных, по сути, числовой, в любом языке программирования

Ты глубоко неправ.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38639078
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВсё-таки про _Bool очень интересно, такое именование не просто так. Мне кажется, это связано с тем, что на этот тип хватит и бита, а выделяется байт, со всеми вытекающимиВ принципе - верно, это наименование сделано в учебнике с прицелом на "использовать минимальный возможный объем для хранения". Но минимальный возможный объем это всегда байт. Так что...

SashaMercuryЕщё возник один простой вопрос. Верны ли предложения ниже ?
1. Объект объявленный как char имеет размер достаточный для хранения basic execution character set. То есть можно утверждать:
char символьный тип.
2. Не везде char будет занимать 1 байт.(больше предположение)
3.signed char и unsigned char - принадлежат множеству целых типов (standart integer types).
4. Объём памяти выделенный на plain char и u/s char одинаков.
5. char, signed char, unsigned char это разные вещи. И никто из них не может рассматриваться попарно равным.
6.int=unsigned int, не существует plain int, или plain smth_type кроме char. Хотя в стандарте указывают plain int, я так понял это signed int.
1. Да, утверждать это можно, но только если дашь правильное определение символьного типа.
2. Везде.
3. Да
4. "plain char" == "signed char"
5. Нет. char==signed char. Но signed char != unsigned char
6. Нет. int == signed int


SashaMercuryНесколько раз встретил "alignment requirements" . Забыл сразу спросить про то, как правильно это понимать.
Для этого тебе надо окунутся слегка в схемотехнику. Байты в памяти обычно хранятся не по отдельности а группами. Эти группы называются "слово". Бывают машины в которых размер слова это один байт, но они чрезвычайно редки.
За счет того что компьютер физически не может переслать из памяти в регистр (и обратно) один байт и всегда работает целиком со словом это приводит к "alignment requirements". Например, если тебе надо работать с одним байтом - процессор выкачает из памяти все слово, но проигнорирует старшие байты. Если тебе надо прочитать слово которое хранится в памяти "не правильно", начало в одном физическом слове, а конец в другом, то зависит от процессора - одни процессоры просто откажутся это делать и программа умрет, а другие (x86) сделают два чтения - прочитают оба физических слова, и сдвинут их как нужно прежде чем положить результат в регистр, это естественно намного медленнее чем чтение правильно лежащего слова.
В С/С++ это выражается в том, что:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
struct A {
  char c;
  int i;
};
struct B {
  int i;
  char c;
};
sizeof(struct A) != sizeof(struct B)

Компилятор сам следит за alignment и старается не резать много-байтовые типы между физическими словами. Это одна из причин почему для каждого типа компьютеров нужен свой компилятор - компилятор должен знать размеры слова. И обозначение 32-bit, 64-bit это как раз и есть размеры слова.
И кстати, если ты пишешь под Винды и привык к типу двух-байтовому типу WORD или четырех-байтовому DWORD - это страшное наследие далекого прошлого, когда Винды были версии 1.0 и работали на 16-и битном процессоре, там действительно слова были по 16 бит. А потом, микрософты просто поленились обновить эти обозначения.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38639083
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury6.int=unsigned int
int=signed int
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38639085
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
char может быть как знаковым так и нет в зависимости от настроек компилятора. Поэтому
правильнее считать его отличающимся от обоих и никогда не смешивать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38639088
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl4. "plain char" == "signed char"
Нет.
char, signed char, unsigned char - 3 разных типа.
Единственное что у них равное - размер.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
void test(char c)
{
    cout << "char" << endl;
}
void test(signed char c)
{
    cout << "signed char" << endl;
}
void test(unsigned char c)
{
    cout << "unsigned char" << endl;
}

int main()
{
    test((char)'1');
    test((signed char)'1');
    test((unsigned char)'1');
    return 0;
}



ЗЫ. Для SashaMercury - это С++ если чо :)
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38639097
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот пример демонстрирующий что и в С char и signed/unsigned char тоже разные типы:

Код: plaintext
1.
2.
3.
4.
void tt(char c); 
void tt(signed char c)
{
}


compitererror: conflicting types for 'tt'
void tt(signed char c)
^
note: previous declaration of 'tt' was here
void tt(char c);

Аналогично и с unsigned char
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38639344
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	struct A {
		char c;
		int i;
	};
	struct B {
		int i;
		char c;
	};

	printf("%i ", sizeof(struct A)==sizeof(struct B));


На выходе 1, но видимо это не обязательно ?
Размер 8 Байт, значит для хранения структуры используется одно слово(у меня 64битная ОС).


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
void test(char c)
{
    cout << "char" << endl;
}
void test(signed char c)
{
    cout << "signed char" << endl;
}
void test(unsigned char c)
{
    cout << "unsigned char" << endl;
}

int main()
{
    test((char)'1');
    test((signed char)'1');
    test((unsigned char)'1');
    return 0;
}



Что показывает этот пример ? Что я могу делать явное приведение типов к p/s/u char ?


Код: plaintext
1.
void tt(char c); void tt(signed char c){}


Хороший пример с прототипом)), действительно компилятор ругается.

White Owl , я конечно не идеально понял, но общее представление о том что вы рассказывали иметь буду )
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38639692
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЧто показывает этот пример ? Что я могу делать явное приведение типов к p/s/u char ?
Нет. Пример показывает что так как это 3 разных типа, то можно перегрузить функцию test каждым из них. Если бы какие-то из типов совпадали, то была бы ошибка дублирования определения функции.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38640004
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделай:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	struct A {
		char c;
		int i;
	};
	struct B {
		int i;
		char c;
	};

	printf("%i %i", sizeof(struct A), sizeof(struct B));
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38640054
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	struct A {
		char c;
		int i;
	};
	struct B {
		int i;
		char c;
	};

	printf("%i ", sizeof(struct A)==sizeof(struct B));



На выходе 1, но видимо это не обязательно ?
Размер 8 Байт, значит для хранения структуры используется одно слово(у меня 64битная ОС).
С двумя полями порядок не меняет размер.
А вот с 3 и более полями размер зависит от порядка, как раз из-за выравнивания.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	struct A {
		char c;
		int i;
		char c2;
	};
	struct B {
		int i;
		char c;
		char c2;
	};
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38641677
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl, Anatoly Moskovsky, на выходе 12 8 для примера предложенного последним. Последний вопрос по этой теме.
Дана структура с n количеством полей int, char перемешанных в любом порядке. Можем ли мы утверждать какой объём будет занимать эта структура только исходя из логических выкладок ? Какая информация для этого нужна о процессоре и ОС ?(разрядность вероятно). Либо мы не можем делать 100% предположения.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38641678
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VS Express ругается на _Bool кстати
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38641680
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryVS Express ругается на _Bool кстати
_Bool - из стандартного С, а VS никакие версии стандарта С не поддерживает.
В VS развивали только С++.
(Впрочем обещали исправиться и допилить С)
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38641682
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryWhite Owl, Anatoly Moskovsky, на выходе 12 8 для примера предложенного последним. Последний вопрос по этой теме.
Дана структура с n количеством полей int, char перемешанных в любом порядке. Можем ли мы утверждать какой объём будет занимать эта структура только исходя из логических выкладок ? Какая информация для этого нужна о процессоре и ОС ?(разрядность вероятно). Либо мы не можем делать 100% предположения.
В общем случае - зависит от компилятора и платформы.
Точнее - зависит от параметра packing по умолчанию.
В VS это 8 для 32-битных процессоров, 16 для 64-битных. (Для GCC - не помню)
packing - это предельное выравнивание, которое применяется даже если у типа больший размер.
Зная только этот параметр и выравнивания отдельных типов можно точно рассчитать размеры структур.

В частном случае - для int и char - выравнивания не превышают packing почти на любой платформе, поэтому для всех основных платформ и компиляторов размер структуры с этими типами будет одинаковым, т.е. его можно посчитать не привязываясь к платформе.
...
Рейтинг: 0 / 0
25 сообщений из 262, страница 3 из 11
Форумы / C++ [игнор отключен] [закрыт для гостей] / INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]