|
|
  |
Детская ошибка |
|
|
|
May 13 2016, 05:42
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (aiwa @ May 12 2016, 22:01)  Тоже одни черновики. С системами контроля версий не знаком, поэтому к всеведающим чисто теоретический ворос имеется: если из репозитария черновиков стандарта (https://github.com/cplusplus/draft) можно сгенерировать текущий черновик, то можно ли его откатить к последней версии стандарта? "Сгенерировать" - неправильный термин, правильнее будет "извлечь из хранилища". Можно извлечь любой комит (фиксацию). Если она не помечена веткой или меткой, то можно посмотреть её "фамилию" - хэш и дать команду git checkout <hash> если есть ветка или метка, то git checkout <branchname>/<tagname>
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
May 17 2016, 01:28
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Шо, привидение увидели? Цитата(zltigo) [Pa091]: operator operates on value promoted to int (with possibly unexpected result) [Pe068]: integer conversion resulted in a change of sign Не совсем эта, а похожая ругань очень актуальна для умножений по (неудачным) правилам стандарта. Когда расширение должно быть строго с или без знака, как у исходных операндов.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
May 17 2016, 11:40
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ May 17 2016, 09:00)  ? Сперва они мерились, чей стандарт длиннее. Потом тишина неприлично затянулась. Потом кончился попкорн и терпение. Обсуждение зависло на двух унарных операторах - минусе и тильде. Цитата Цитата(aiwa) А вот унарный оператор ~ стоит особняком: его операнд самодостаточен и совершенно не требует проведения расширения. Цитата(halfdoom) Почему? Ведь это оператор дополнения до единицы, который по совместительству можно использовать для побитовой инверсии. Непонятно, название-то что должно менять? Дополнение до единицы точно так же не арифметическое действие и расширение или заём из старших разрядов не делает. Моё имхо, с самого начала стандартизации эту пару унарных операторов нужно было выполнять в отложенном режиме. При разборе выражения определив до какого размера придётся "расширяться" операндам. И делать расширение один раз. Но поезд ушёл.
Сообщение отредактировал GetSmart - May 17 2016, 12:04
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
May 17 2016, 13:47
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(GetSmart @ May 17 2016, 14:40)  Непонятно, название-то что должно менять? Дополнение до единицы точно так же не арифметическое действие и расширение или заём из старших разрядов не делает. Дополнение до единицы является вполне действием одного класса с вычитанием, сложением или умножением, потому что определяется посредством алгебры многочленов. Называть эти действия арифметическими или еще как - уже не важно. В этом и состоит коренное отличие от операций булевой алгебры. Закон жесток, но это закон. Цитата(GetSmart @ May 17 2016, 14:40)  Обсуждение зависло на двух унарных операторах - минусе и тильде. У унарного минуса нет такого эффекта, как у тильды. Дополнительно-расширенные разряды "минуса" лишь подтверждают результат, у тильды же они его меняют.
|
|
|
|
|
May 17 2016, 14:35
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(aiwa @ May 17 2016, 17:47)  Дополнение до единицы является вполне действием одного класса с вычитанием, сложением или умножением, потому что определяется посредством алгебры многочленов. Называть эти действия арифметическими или еще как - уже не важно. В этом и состоит коренное отличие от операций булевой алгебры. Закон жесток, но это закон. Закон должен быть корректен. Его терминология должна быть практически реализуемой. И соответствовать реализованным в компиляторах действиям. Чтобы не оказалось, что разработчики компиляторов что-то недопоняли. Или недопонимали ранее. "По словам Майкрософта" и прочих: Цитата Оператор дополнения до единицы (~), иногда называемый оператором поразрядного отрицания, дополняет свой операнд до единицы в каждом разряде. эти два термина - синонимы. В практической реализации, с ограничением ширины операндов. Приведите какой-либо пример применения тильды, в котором по стандарту она (оператор) не является поразрядной/побитовой инверсией. По поводу многочленов тоже не ясно. Тильда в Си применяется к целочисленным операндам и результат тоже целочисленный. Как и все остальные до этого обсуждаемые в этой ветке операторы. Предполагаю, что это противоречит терминологии алгебры многочленов.
Сообщение отредактировал GetSmart - May 17 2016, 17:17
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
May 17 2016, 16:43
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(GetSmart @ May 17 2016, 17:35)  Закон должен быть корректен. Его термилогия должна быть практически реализуемой. .... Должен быть, но на практике не всегда. Одни из важнейших терминов стандарта "lvalue" и "rvalue" вообще не имеют строгого определения и понимаются интуитивно. Цитата(GetSmart @ May 17 2016, 17:35)  "По словам Майкрософта" и прочих:........ эти два термина - синонимы. В практической реализации, с ограничением ширины операндов.
Приведите какой-либо пример применения тильды, в котором по стандарту она (оператор) не является поразрядной/побитовой инверсией. Они синонимы в той же степени как "Наrd disk" и "винчестер". Дают одинаковый результат, вот и считаются синонимами. Порязрадная инверсия помогает быстро вычислить дополнение, но формально это совершенно разные понятия. Победил комп с двоичной формой представления чисел, в других системах, например из далекого прошлого, говорить о поразрядных битовых операциях было бы вообще бессмысленно. Хотя операция дополнения вполне имела бы место. С дополнением искусственный пример придумывать не хочется, сколько себя помню, всегда применял тильду не по стандарту, а только лишь для поразрядной логики. Цитата(GetSmart @ May 17 2016, 17:35)  По поводу многочленов тоже не ясно. Тильда в Си применяется к целочисленным операндам и результат тоже целочисленный. Как и все остальные до этого обсуждаемые в этой ветке операторы. Предполагаю, что это противоречит терминологии алгебры многочленов. Способ представления чисел уже основан на алгебре многочленов, ну и, естественно, и операции над ними. Дополнение до двух в этой алгебре необходимо лишь для исполнения операций вычитания - хотя от нас это все скрыто, но формально это так. А для операции тильда в смысле поразрядной логики все это многочленство излишне - достаточно лишь набор инверторов размером с операнд.
Сообщение отредактировал aiwa - May 17 2016, 16:44
|
|
|
|
|
May 17 2016, 17:05
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(aiwa @ May 17 2016, 20:43)  С дополнением искусственный пример придумывать не хочется, сколько себя помню, всегда применял тильду не по стандарту, а только лишь для поразрядной логики. Почему искуственный? Нужен пример демонстрирующий принципиальное отличие в рамках языка Си. Или похожего на Си языка программирования. Для демонстрации идеи термина в рамках языков программирования. Название/термин из алгебры многочленов может не весить (значить) ничего (большего, чем побитовая инверсия). Цитата(aiwa @ May 17 2016, 20:43)  Должен быть, но на практике не всегда. В таких случаях неуместно "Закон жесток, но это закон.". Жесток только там и настолько, насколько корректен. Цитата(aiwa) Одни из важнейших терминов стандарта "lvalue" и "rvalue" вообще не имеют строгого определения и понимаются интуитивно. Есть ключевые признаки этих терминов. "Объект с адресом и имеющий значение/содержимое" и "значение/содержимое". Слэш здесь понимается как обобщение. Хотя некоторые значения (булевы) в Си не могут быть содержимым.
Сообщение отредактировал GetSmart - May 17 2016, 19:34
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
May 17 2016, 17:57
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(GetSmart @ May 17 2016, 20:05)  Почему искуственный? Нужен пример демонстрирующий принципиальное отличие в рамках языка Си. Или похожего на Си языка программирования. Для демонстрации идеи термина в рамках языков программирования. Язык тут совершенно не причем, а важна целесообразность. Дополнение в жизни как-то не нужно, поэтому и примеры будут искуственные. А вот побитовые операции важны для манипулирования дискретными сигналами, или группой сигналов. И то что эти операции проводятся над целочисленными операндами - всего лишь следствие аппаратной реализации. Цитата(GetSmart @ May 17 2016, 20:05)  Название/термин из алгебры многочленов может не весить (значить) ничего (большего, чем побитовая инверсия). Инверсия битов - это быстрый косвенный способ вычисления дополнения. По аналогии с умножением: мы производим умножение столбиком, но когда умножаем на 10 то просто дописываем сзади "0", опуская сам процесс умножение. В системе счисления по основанию 3 дополнение до 3 надо будет вычислять уже по определению дополнения, хотя возможно и будет более удобный и быстрый косвенный способ как инверсия в двоичной системе. Цитата(GetSmart @ May 17 2016, 20:05)  В таких случаях неуместно "Закон жесток, но это закон.". Жесток только там и настолько, насколько корректен. Он определяет тильду как дополнение. Хотя и называет ее в разных местах по всякому. Мы можем использовать свойства дополнения быть инверсией как результат порязрядного отрицания, но формально это все же дополнение. Это кажется тавтологией, но здесь, как и при умножении матриц важны совпадения соразмерностей матриц. Ведь логическое поразрядное отрицание восьмибитного операнда, по сути, это совокупность восьми логических операций, а шеснадцатиразрядного - совокупность шестнадцати операций. Поэтому расширение операнда в трактовке тильды как поразрядного отрицания уже изменяет сам набор операций, в отличие от дополнения когда операция по сути та же. Жизни программиста это никак не мешает, надо лишь помнить, что "побитовые операции" - сленг рожденный из-за схожести с настоящими побитовыми операциями.
Сообщение отредактировал aiwa - May 17 2016, 17:57
|
|
|
|
|
May 17 2016, 18:25
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(aiwa @ May 17 2016, 21:57)  В системе счисления по основанию 3 дополнение до 3 надо будет вычислять уже по определению дополнения, хотя возможно и будет более удобный и быстрый косвенный способ как инверсия в двоичной системе. ... Он определяет тильду как дополнение. Хотя и называет ее в разных местах по всякому. Мы можем использовать свойства дополнения быть инверсией как результат порязрядного отрицания, но формально это все же дополнение. Это кажется тавтологией, но здесь, как и при умножении матриц важны совпадения соразмерностей матриц. ... Жизни программиста это никак не мешает, надо лишь помнить, что "побитовые операции" - сленг рожденный из-за схожести с настоящими побитовыми операциями. Не тавтологией. Словоблудием. Введением в заблуждение. В стандарте указано без всяких разночтений, что целочисленные операнды представлены в двоичном коде. Отрицательные числа в двоичном дополнительном коде. Именно это нужно помнить и понимать. С этой базы нагружать оператор нереализуемыми свойствами бессмысленно. Пока в возможностях языка это видится как два названия одного и того же действия. Точнее из терминов/названий будет тот, который не содержит ложных ассоциаций. Кроме того, операция инверсии бит является частью группы логических побитовых/булевых операций и считать этот функционал тильды "работающим по-совместительству" нет оснований. Или можно вполне законно считать, что логические операторы тоже имеют воображаемые свойства из какой-либо ещё алгебры. Приведённые примеры к языкам, похожим на Си отношения не имеют. Пока всё мимо. Цитата Он определяет тильду как дополнение. Хотя и называет ее в разных местах по всякому. Использование в основном текстовом определении это тоже называние. Это ещё можно толковать как "желательный" вербальный термин, ничем функционально (по действию) не отличающийся от альтернативных названий. Пока нет аргументов утверждать, что тильда в Си это не побитовая инверсия. Аргументом может быть текст на Си, который должен выполнить что-то другое или большее, чем побитовую инверсию. А не словоблудие, в т.ч. в стандарте.
Сообщение отредактировал GetSmart - May 18 2016, 06:47
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
May 18 2016, 01:42
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(ViKo @ May 17 2016, 21:18)  Господа, вы занимаетесь казуистикой. Надо помнить одно - операции выполняются в регистрах (или аккумуляторе), имеющих конкретную длину - integer, и выполняются во всю эту длину, естественно. Это и использовано в стандарте на язык С. Размер регистра для компилятора алгоритмически не важен: он влияет только на производительность и размер генерируемого кода. При выполнении большинства арифметических действий такое расширение по умолчанию вполне логично и оправдано: получается более короткий и быстрый код. Грубо говоря, при этом меняется не размерность операндов (или результата) а размерность средства представления. От хранения в большей по размеру коробке, хранимая вещь никак не изменится. Цитата(ViKo @ May 17 2016, 21:18)  Вот как там у 8-разрядных микроконтроллеров с int дело обстоит? Там, наверное, int8 до int16 или int32 не продвигается? Не всегда продвигается. Например, я всегда использую char вместо int в качестве счетчика цикла - код получается меньше и быстрее. Цитата(GetSmart @ May 17 2016, 21:25)  Кроме того, операция инверсии бит является частью группы логических побитовых/булевых операций и считать этот функционал тильды "работающим по-совместительству" нет оснований. Другого до сих пор не обозначено. Как раз в стандарте обозначено совершенно другое: Цитата The operand of ~ shall have integral or unscoped enumeration type; the result is the ones’ complement of its operand. Это пункт 5. Unary operators. Формально тильда не относится к группе логических поразрядных операторов. И синоним у нее не тот который преподносит мелкософт, а "compl" - сокращение от официального названия операции дополнения.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|