powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
25 сообщений из 262, страница 1 из 11
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38613902
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Решил познакомиться с вышеупомянутым документом. При переводе возникли трудности. Возможно они связаны с недостаточными знаниями основ информатики и вычислительной техники или/и возможно у меня недостаточные знания английского языка. Мне кажется стоит создать раздел (этот топ) в котором можно будет задавать вопросы по данному документу. Если не стоит, то модераторам стоит закрыть данный раздел(им виднее).
В любом случае, пока у меня один вопрос.
INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x5.1.2 Execution environments
1 Two execution environments are defined: freestanding and hosted. In both cases,
program startup occurs when a designated C function is called by the execution
environment. All objects with static storage duration shall be initialized (set to their
initial values) before program startup. The manner and timing of such initialization are
otherwise unspecified. Program termination returns control to the execution
environment.
Forward references: storage durations of objects (6.2.4), initialization (6.7.9).
5.1.2.1 Freestanding environment
1 In a freestanding environment (in which C program execution may take place without any
benefit of an operating system), the name and type of the function called at program
startup are implementation-defined. Any library facilities available to a freestanding
program, other than the minimal set required by clause 4, are implementation-defined.
2 The effect of program termination in a freestanding environment is implementationdefined.
5.1.2.2 Hosted environment
1 A hosted environment need not be provided, but shall conform to the following
specifications if present.

Freestanding environment - это запуск вне ОС ? Например это набор программ на С реализующих ОС ?
Hosted environment - запуск в среде ОС, например программа написанная в IDE VS и запущенная в W7 ? Хотя какая разница где она написана.

PS
Я кстати удивился что так часто встречаю "shall" в этом документе.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38613915
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x5.1.2.2.1 Program startup
The function called at program startup is named main. The implementation declares no
prototype for this function. It shall be defined with a return type of int and with no
parameters:
int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names may be
used, as they are local to the function in which they are declared):
int main(int argc, char *argv[]) { /* ... */ }
or equivalent;10) or in some other implementation-defined manner.

If they are declared, the parameters to the main function shall obey the following
constraints:
— The value of argc shall be nonnegative.


Всё логично. Тогда почему не сделать у argc тип unsigned int подумал я. Проверил
Код: plaintext
1.
2.
3.
4.
5.
6.
int main(int argc, char** argv)
{
	argc = -5;
	printf("%i", argc);
	return 0;
}



Происходит неявное преобразование видимо. Как получилось что argc=-5, хотя согласно "The value of argc shall be nonnegative" быть такого не может.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38613916
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compiling in Free-Standing Environments :
OracleThe Solaris Studio C compiler supports compilation of programs that link with the standard C library and execute in a runtime environment that includes the standard C library and other runtime support libraries. The C standard terms such an environment a hosted environment. An environment that does not provide the standard library functions is termed a free-standing environment
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38613919
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПроисходит неявное преобразование видимоКакое, нафик, "неявное преобразование" для аргумента типа (знаковый) int?!Как получилось что argc=-5, хотя согласно "The value of argc shall be nonnegative" быть такого не может.Вообще оксюморон - присвоили знаковой переменной отрицательное значение, выбрали соответствующий модификатор и удивляемся, что всё отработало так, как должно отработать.

P.S. Число аргументов, если оно передаётся, формирует окружение. Это окружение должно передавать неотрицательное значение. Не обязано, но должно.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38613921
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryFreestanding environment - это запуск вне ОС ? Например это набор программ на С реализующих ОС ?
Hosted environment - запуск в среде ОС, например программа написанная в IDE VS и запущенная в W7 ? Хотя какая разница где она написана.
Да.
SashaMercuryPS
Я кстати удивился что так часто встречаю "shall" в этом документе.
На юридическом языке "shall" имеет значение "должен".
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38613923
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нееет, я не так написал. До этого я пробовал присваивать unsigned int a =-5, и присваивание происходило. Вопрос в голове остался(подумал-наверное неявное преобразование), а код не стал оставлять.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38613927
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
Вообще оксюморон - присвоили знаковой переменной отрицательное значение, выбрали соответствующий модификатор и удивляемся, что всё отработало так, как должно отработать.

Я удивляюсь что это произошло, ведь согласно черновику стандарта такое действие незаконно

INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x— The value of argc shall be nonnegative.


Anatoly Moskovsky На юридическом языке "shall" имеет значение "должен".

Знаю, просто давно его не встречал в таком количестве, вот и удивился ;) Вспоминается классический пример "will you marry me" и ветка ответов "yes, I will !", "yes, I shall", так мы учили разницу между shall и will C:
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38613931
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДо этого я пробовал присваивать unsigned int a =-5, и присваивание происходило. Вопрос в голове остался(подумал-наверное неявное преобразование)В фон-неймановской архитектуре знаковость - (в основном) вопрос интерпретации.
Чтобы запретить присваивание отрицательных значений беззнаковым переменным требуется нехилая поддержка времени выполнения: все присваивания надо проверять и "что-то делать" с недопустимыми.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38613935
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЯ удивляюсь что это произошло, ведь согласно черновику стандарта такое действие незаконноЯ повторю: значение переменной формирует окружение, передающее управление на точку входа функции main.
Это окружение должно, а вовсе не обязано, формировать неотрицательное значение.
Если стандарт(ы) обязывают, то в них так и пишут - must/must not. Второй вариант лучше переводить как "не имеет права".
Как переменная argc будет использована внутри функции main и будет ли она вообще использована - личное дело этой функции.
Может, например, декрементировать значение argc после анализа очередного аргумента в цикле. Тогда нулевое/отрицательное значение станет граничным условия для такого цикла.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38613973
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДо этого я пробовал присваивать unsigned int a =-5, и присваивание происходило.
Тут все просто. Разрядность ограниченная, у знаковых старший бит это знак (0+, 1-), поэтому знаковое -5 хранится также как беззнаковое 2^N - 5, где N количество разрядов.
Булеву алгебру почитай. Там вычитания нет, достаточно инверсии и сложения.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38614064
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо, понял.
По argc снова вижу избыточность. Вечером подумаю.
Ставлю спецификатор i, и выводится int
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38615983
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое "integer promotion", я в общих чертах разобрался. Сейчас ещё читаю.

1. Можно сказать что это частный случай приведения к наибольшему общему типу ?
2. Как правильно перевести на русский язык ? или в таких случаях лучше называть вещи по-английски ?
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38616000
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЧто такое "integer promotion", я в общих чертах разобрался. Сейчас ещё читаю.

1. Можно сказать что это частный случай приведения к наибольшему общему типу ?
2. Как правильно перевести на русский язык ? или в таких случаях лучше называть вещи по-английски ?
1. Нет. В С есть только два случая неявного приведения типов - в int и в void*. Поэтому о "частном" случае говорить нельзя. И их достаточно мало чтобы зазубрить.
2. Если за те пол-минуты пока я пишу фразу я не вспомнил русскоязычный аналог термина - оставляю его на английском. Проще жить намного :)
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38616007
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитал ещё тут .
Удивил комментарий по следующему коду
Код: plaintext
1.
2.
3.
	signed int si = -1;
	unsigned int ui = 1;
	printf("%d", si < ui);//print 0



по ссылке вышеIn this example, the comparison operator operates on a signed int and an unsigned int. By the conversion rules, si is converted to an unsigned int. Because -1 cannot be represented as an unsigned int value, the -1 is converted to UINT_MAX in accordance with the C Standard, subclause 6.3.1.3, paragraph 2 [ISO/IEC 9899:2011]:


Ссылаются в документ в названии топа, я проверил, вроде-бы так.
Вопрос: почему правило именно такое, и в данном случае signed int приводится к unsigned int. Почему не сделали наоборот ?
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38616010
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl, спасибо, понял.
White OwlВ С есть только два случая неявного приведения типов - в int и в void*

INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 5.1.2.3 12EXAMPLE 3 Similarly, in the fragment
float f1, f2;
double d;
/* ... */
f1 = f2 * d;
the multiplication may be executed using single-precision arithmetic if the implementation can ascertain
that the result would be the same as if it were executed using double-precision arithmetic (for example, if d
were replaced by the constant 2.0, which has type double).


Мне показалось что в данном случае правая часть может быть посчитана с использованием арифметики двойной точности, а значит будет и неявное преобразование. Наверное что-то не так понял ?
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38616037
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВопрос: почему правило именно такое, и в данном случае signed int приводится к unsigned int. Почему не сделали наоборот ?
signed int: 1 бит под знак + 31 под значение
unsigned int: 32 под значение

Как из 32 битного значения сделать 31 битное?

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

Вот ещё по неявному приведению,
INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 5.1.2.3 13EXAMPLE 4 Implementations employing wide registers have to take care to honor appropriate
semantics. Values are independent of whether they are represented in a register or in memory. For
example, an implicit spilling of a register is not permitted to alter the value. Also, an explicit store and load
is required to round to the precision of the storage type. In particular, casts and assignments are required to
perform their specified conversion. For the fragment
double d1, d2;
float f;
d1 = f = expression;
d2 = (float) expression;
the values assigned to d1 and d2 are required to have been converted to float.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38616086
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryналичие знака, равносильно умножению на два количество вариантов без знаков, да ещё плюс 1, ибо вместо двух нулей, теперь 1.
Хотя в ваших словах наверное есть логика, с точки зрения арифметики и представления чисел в ЭВМ.
Так и есть. Если интересно, то вот тебе табличка на примере двух битов как представление происходит:
ДвоичноеБеззнаковоеЗнаковое000+0011+1102-2113-1
SashaMercuryВот ещё по неявному приведению,
Тут я тебе не подскажу, никогда типы с плавающей запятой не были нужны.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38616125
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury2. Как правильно перевести на русский язык ? или в таких случаях лучше называть вещи по-английски ?
Я встречал и сам использую перевод "integer promotion" как "расширение [целого] типа".
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38616514
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо :) понял все кроме неявного приведения, но думаю этот вопрос решится позже.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38617109
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.
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;



проверил на разных значениях, получалось эквивалентно. Приведите пример чтобы было не эквивалентно, пожалуйста
2.INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 5.1.2.3 15EXAMPLE 6 To illustrate the grouping behavior of expressions, in the following fragment
Код: plaintext
1.
2.
3.
int a, b;
/* ... */
a = a + 32760 + b + 5;


the expression statement behaves exactly the same as
Код: plaintext
1.
a = (((a + 32760) + b) + 5);


due to the associativity and precedence of these operators. Thus, the result of the sum (a + 32760) is
next added to b, and that result is then added to 5 which results in the value assigned to a. On a machine in
which overflows produce an explicit trap and in which the range of values representable by an int is
[-32768, +32767], the implementation cannot rewrite this expression as
Код: plaintext
1.
a = ((a + b) + 32765);


since if the values for a and b were, respectively, -32754 and -15, the sum a + b would produce a trap while the original expression would not; nor can the expression be rewritten either as
Код: plaintext
1.
2.
3.
a = ((a + 32765) + b);
or
a = (a + (b + 32765));


since the values for a and b might have been, respectively, 4 and -8 or -17 and 12. However, on a machine
in which overflow silently generates some value and where positive and negative overflows cancel, the
above expression statement can be rewritten by the implementation in any of the above ways because the
same result will occur.


Проверил всё, и всё ок, видимо он знает в каком порядке вычислять, либо незримо для меня расширяет правую часть как и в случаем с чарами в правой части. Либо я что-то не так понял с переводом, ниже мой код и комментарии
Код: plaintext
1.
2.
3.
4.
5.
6.
	int a=0, b=100, c=10;
	a = (a + 2147483647 + b) -100; 
	printf("%i \n", a);//2147483647

	a = (-2147483647 - 1000) + a;
	printf("%i \n", a);//-1000
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38617135
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryпроверил на разных значениях, получалось эквивалентно. Приведите пример чтобы было не эквивалентно, пожалуйста
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	double x, y, z;
	do {
		x = rand();
		y = rand();
		z = (x - y) + y ;
	} while(z != y);
	printf("%f %f\n", x, y);


При переводе привычных нам десятичных чисел в двоичные с плавающей запятой возникают периодические дроби, а т.к. мантисса имеет конечную длину, то имеем погрешность. Поэтому проверять на равно и неравно их нельзя.
SashaMercuryПроверил всё, и всё ок, видимо он знает в каком порядке вычислять, либо незримо для меня расширяет правую часть как и в случаем с чарами в правой части. Либо я что-то не так понял с переводом, ниже мой код и комментарии
Я так понял что при переполнении не гарантируется правильный результат.
Код: plaintext
1.
2.
3.
4.
5.
	int a=0, b=100;
	a = (a + 2147483647 + b); 
	printf("%i \n", a);//-2147483549 т.е. переполнение
	a -= 100; 
	printf("%i \n", a);//2147483647


Т.е. то что на твоем процессоре правильно посчиталось не означает что на всех так же будет.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38617145
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Код: plaintext
1.
	} while(z != y);


Тут напутал, надо
Код: plaintext
1.
	} while(z == x);


Так не находит, зацикливается. Пример сделать не удалось, но такие случаи возможны из-за наличия погрешности.
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38617199
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо :) Сейчас попробую
...
Рейтинг: 0 / 0
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
    #38617207
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример когда z != x
Код: plaintext
1.
2.
3.
	double x = 1.2, y = 12;
	double z = (x - y) + y;
	printf("%f %s %f (%e)\n", x, ((x == z) ? "==": "!="), z, x - z);
...
Рейтинг: 0 / 0
25 сообщений из 262, страница 1 из 11
Форумы / C++ [игнор отключен] [закрыт для гостей] / INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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