powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
25 сообщений из 262, страница 2 из 11
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38617701
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только с бассейна пришел, уже нельзя включать компьютер (, завтра проверю
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38617945
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryINTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 5.1.2.3 14 example 5
Код: plaintext
1.
2.
double x, y, z;
z = (x - y) + y ; // not equivalent toz = x;


проверил на разных значениях, получалось эквивалентно.Пробуйте вычитать очень близкие значения.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38618010
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovПробуйте вычитать очень близкие значения.
Маловероятно что будут потери. Пример (условный, числа как бы двоичные)
Код: plaintext
1.
2.
3.
4.
a = 0.101010101 * 2^5;
b = 0.101010100 * 2^5;
c = a - b = 0.10000000 * 2^-3; // или 0.000000001 * 2^5
c + b = 0.101010101 * 2^5;


Тут уменьшаемое должно быть значительно меньше вычитаемого, тогда будут потери на обратной операции. Пример я выше привел.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38618157
nyash-myash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SashaMercury1.
INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 5.1.2.3 14 example 5
Код: plaintext
1.
2.
double x, y, z;
z = (x - y) + y ; // not equivalent toz = x;



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


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
double x = -9007199254740992, y = 1, z;
z = (x - y) + y;
if (z != x)
    printf("z != x\n");
// В некоторых случаях все равно z == x
// Можно повысить шанс неравенства введя дополнительную переменную.
double z1,z2;
z1 = x - y;
z2 = z1 + y;
if (z2 != x)
    printf("z2 != x\n");
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38618208
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо, понял. Действительно существует расхождение.
Пытался вывести на экран битовое представление double, не получилось, ибо побитовое и видимо работает только с целым типом. Ещё подумаю.

Почему не расширить препроцессор математическим аппаратом для упрощения выражений такого вида ? Если даже Maple одной командой evalf или simplify позволяет упростить входную строку.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38618257
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВсем спасибо, понял. Действительно существует расхождение.
Пытался вывести на экран битовое представление double, не получилось, ибо побитовое и видимо работает только с целым типом. Ещё подумаю.
Выводи как массив unsigned char[8]. Возможно байты в памяти в обратном порядке хранятся. Структура хранения тут описана
Правила преобразования если интересно
SashaMercuryПочему не расширить препроцессор математическим аппаратом для упрощения выражений такого вида ? Если даже Maple одной командой evalf или simplify позволяет упростить входную строку.
Потому что в таком виде мало кто пишет. Это просто наглядный пример.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38619971
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima_TВыводи как массив unsigned char[8].


Код: plaintext
1.
2.
3.
4.
5.
6.
	double x = 125;
	unsigned char* px = (unsigned char*)&x;
	for (int i = 0; i < sizeof(x); i++)
	{
		printf("%u \n", *(px+i));
	}



примерно так ? По этим числам я уже в принципе могу понять какой двоичный код хранится с байтах
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38619997
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryпримерно так ? По этим числам я уже в принципе могу понять какой двоичный код хранится с байтах
Примерно да, только выводи в шестнадцатеричном виде или сразу в двоичном, так понятнее. И байты в обратном порядке читай.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 	double x = 1;
	for (unsigned char* px = (unsigned char*)&x + sizeof(x) - 1; px >= (unsigned char*)&x; px--)
	{
		for(int j = 128; j > 0; j >>= 1) {
			printf("%s", (*px & j) ? "1":"0");
		}
		printf("=0x%02X\n", *px);
	}
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38620014
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
Переписал код так. Для double x=1 показывает не то. Проверил ваш код вместе со своим, аналогично. Я думал что для хранения единицы будет в единице только 1 бит, остальные в ноль.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	for (unsigned char* px = (unsigned char*)&x + sizeof(x)-1; px >= (unsigned char*)&x; px--)//иду по байтам double
	{
		for (int j = sizeof(unsigned char)* 8-1; j >=0; j--)
		{
			printf("%s", (*px)&(1 << j) ? "1" : "0");
		}
		printf("\n");
	}
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38620018
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДля double x=1 показывает не то.
Что не то? Я тебе ссылку выше давал
Читаем
Примеры чисел двойной точности0x 3ff0 0000 0000 0000 = 1
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38620019
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Туплю. Конечно то. Там фишка вся в мантиссе, забыл. Извиняюсь, не прав (
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38620023
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторОкончательное значение числа равняется ±1,мантисса · 2^(порядок − 01111111111) старший бит мантиссы, всегда равный единице, опускается, а порядок 0 записывается как 2^10 - 1 = 1023
т.е. 1 = 1.00000 * 2^0
1. убираем, 0 заменяем на 01111111111 (=1023=0x3FF), получаем
Код: plaintext
1.
0 01111111111 000000...

или
Код: plaintext
1.
0x3FF0        000000...
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38620033
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
		for (int j = sizeof(unsigned char)* 8-1; j >=0; j--)


128 это (1 << (sizeof(unsigned char)* 8-1))
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38620044
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima_T128 это (1 << (sizeof(unsigned char)* 8-1))

У меня немного другой цикл. Я подумал, зачем вы приводите к unsigned char а не просто к char. Прочитал на хабре почему так, и решил что раз unsigned char является абстракцией машинного байта, то есть смысл сделать этот цикл для всех машин, и для тех где 1 байт занимает, например, 9 бит. А сейчас я смотрю на свой код, вижу *8 и понял что у меня не получилось то что я хотел
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38620064
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1 байт везде 8 бит
Также принято значения байта считать беззнаковыми, т.е. 0...255, поэтому unsigned char
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38621868
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T1 байт везде 8 битСейчас.
А то есть у меня старенький справочник по це, так там и девятибитные системы упомянуты :-)
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38621893
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovDima T1 байт везде 8 битСейчас.
А то есть у меня старенький справочник по це, так там и девятибитные системы упомянуты :-)
Там и биты с тремя состояниями наверно упоминаются
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38621899
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТам и биты с тремя состояниями наверно упоминаются А не угадали :-)
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38638264
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Начал читать раздел 6.2.5 Types. Подскажите пожалуйста в тех моментах, где я не до конца разобрался.

1.
INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 6.2.5.16.2.5 Types
1 The meaning of a value stored in an object or returned by a function is determined by the
type of the expression used to access it. (An identifier declared to be an object is the
simplest such expression; the type is specified in the declaration of the identifier.) Types
are partitioned into object types (types that describe objects) and function types (types
that describe functions). At various points within a translation unit an object type may be
incomplete (lacking sufficient information to determine the size of objects of that type) or
complete (having sufficient information))

Например во время integer promotion ? Когда char может быть расширен до int ?
2.
INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 6.2.5.2An object declared as type _Bool is large enough to store the values 0 and 1.

Почему этот тип называется _Bool а не bool ?(вообще название выделяется из остальных, хотя бы тем что начинается с "_") Я могу хранить только 0 и 1, или как минимум 0 и 1 ?

3.
INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 6.2.5.4There are five standard signed integer types, designated as signed char, short
int, int, long int, and long long int. (These and other types may be
designated in several additional ways, as described in 6.7.2.) There may also be
implementation-defined extended signed integer types. The standard and extended
signed integer types are collectively called signed integer types.

Приведите пожалуйста пример

4.
quote INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 6.2.5.5An object declared as type signed char occupies the same amount of storage as a
‘‘plain’’ char object. A ‘‘plain’’ int object has the natural size suggested by the
architecture of the execution environment (large enough to contain any value in the range
INT_MIN to INT_MAX as defined in the header <limits.h>).

Я понимаю это как -"классический" char. Как правильно ? Можно ли самому менять диапазоны в этом файле ? Подозреваю что можно. Но сомневаюсь, что если поставлю в максимум 2^100 fe, то мне выделится 13 байт при объявлении int.

5.
INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 6.2.5.9The range of nonnegative values of a signed integer type is a subrange of the
corresponding unsigned integer type, and the representation of the same value in each
type is the same.41) A computation involving unsigned operands can never overflow,
because a result that cannot be represented by the resulting unsigned integer type is
reduced modulo the number that is one greater than the largest value that can be
represented by the resulting type.

Второе место где возникли трудности, скорее не с переводом, а с пониманием. Вот как я это понял:
Если операндами выражения являются unisigned int, то мы никогда не получим переполнение, потому что, в том случае, если у нас есть переполнение(или как написано-если результат не может быть представлен в unsigned int), то над результатом(над каким результатом ?) произойдёт операция reduced modulo...дальше не понял
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38638266
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury1.
INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 6.2.5.16.2.5 Types
1 The meaning of a value stored in an object or returned by a function is determined by the
type of the expression used to access it. (An identifier declared to be an object is the
simplest such expression; the type is specified in the declaration of the identifier.) Types
are partitioned into object types (types that describe objects) and function types (types
that describe functions). At various points within a translation unit an object type may be
incomplete (lacking sufficient information to determine the size of objects of that type) or
complete (having sufficient information))

Например во время integer promotion ? Когда char может быть расширен до int ?
Нет. Это про структуры/классы.
Код: plaintext
1.
2.
3.
4.
struct S;  // предварительное объявление, тип неполный, размер неизвестен
struct S* ptr; // так можно
struct S s; // так нельзя для неполных типов
struct S { int a;};  // окончательное объявление, после этого тип можно использовать без ограничений


SashaMercury2.
INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 6.2.5.2An object declared as type _Bool is large enough to store the values 0 and 1.

Почему этот тип называется _Bool а не bool ?(вообще название выделяется из остальных, хотя бы тем что начинается с "_") Я могу хранить только 0 и 1, или как минимум 0 и 1 ?
Почему _Bool не знаю.
Хранить можно только 0 и 1 остальное не гарантируется.

SashaMercury3.
INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 6.2.5.4There are five standard signed integer types, designated as signed char, short
int, int, long int, and long long int. (These and other types may be
designated in several additional ways, as described in 6.7.2.) There may also be
implementation-defined extended signed integer types. The standard and extended
signed integer types are collectively called signed integer types.

Приведите пожалуйста пример
например, на некоторых платформах есть тип __int128
SashaMercury4.
quote INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 6.2.5.5An object declared as type signed char occupies the same amount of storage as a
‘‘plain’’ char object. A ‘‘plain’’ int object has the natural size suggested by the
architecture of the execution environment (large enough to contain any value in the range
INT_MIN to INT_MAX as defined in the header <limits.h>).

Я понимаю это как -"классический" char. Как правильно ? Можно ли самому менять диапазоны в этом файле ? Подозреваю что можно. Но сомневаюсь, что если поставлю в максимум 2^100 fe, то мне выделится 13 байт при объявлении int.
plain - это простой. В данном случае имеется в виду char без модификаторов signed/unsigned
Менять хедеры описанные в стандарте - нельзя. (Да и бессмысленно в данном случае, т.к. <limits.h> всего лишь описывает жестко зашитые в компилятор лимиты, а не задает их)

SashaMercury5.
INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 6.2.5.9The range of nonnegative values of a signed integer type is a subrange of the
corresponding unsigned integer type, and the representation of the same value in each
type is the same.41) A computation involving unsigned operands can never overflow,
because a result that cannot be represented by the resulting unsigned integer type is
reduced modulo the number that is one greater than the largest value that can be
represented by the resulting type.

Второе место где возникли трудности, скорее не с переводом, а с пониманием. Вот как я это понял:
Если операндами выражения являются unisigned int, то мы никогда не получим переполнение, потому что, в том случае, если у нас есть переполнение(или как написано-если результат не может быть представлен в unsigned int), то над результатом(над каким результатом ?) произойдёт операция reduced modulo...дальше не понял

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

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

Ниже пример куска где используется это словосочетание:

INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 6.2.5.13 Each complex type has the same representation and alignment requirements as an array
type containing exactly two elements of the corresponding real type; the first element is
equal to the real part, and the second element to the imaginary part, of the complex
number.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38638310
Фотография 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.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38638320
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
7.

9899:201x 14 The type char, the signed and unsigned integer types, and the floating types are
collectively called the basic types. The basic types are complete object types. Even if the
implementation defines two or more basic types to have the same representation, they are
nevertheless different types.44)
15 The three types char, signed char, and unsigned char are collectively called
the character types. The implementation shall define char to have the same range,
representation, and behavior as either signed char or unsigned char.45)
16 An enumeration comprises a set of named integer constant values. Each distinct
enumeration constitutes a different enumerated type.
17 The type char, the signed and unsigned integer types, and the enumerated types are
collectively called integer types. The integer and real floating types are collectively called
real types.

К чему это было смешивать. Было бы так char-символьный, u/s char -целый. А тут получается что u/s char принадлежит двум пространствам. Это мне не нравится. Тогда какой смысл в этом выделении plain char. Да и вообще двусмысленность получается. Может быть я что-то не так понял..
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38638410
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНесколько раз встретил "alignment requirements" . Забыл сразу спросить про то, как правильно это пониматьТребования к выравниванию.
Например, в x86 обращение к слову, которое расположено по нечётному адресу "штрафуется" (только) лишними циклами циклами обращения к памяти.
Есть архитектуры, где такие обращения запрещены и будет сгенерировано аппаратное исключение.
В x86 начиная, если правильно помню, с i486 есть специальный "бит выравнивания" в слове состояния процессора - если установить, то невыровненные обращения будут вызывать аппаратное исключение.
...
Рейтинг: 0 / 0
25 сообщений из 262, страница 2 из 11
Форумы / C++ [игнор отключен] [закрыт для гостей] / INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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