Аллилуйя C++20 !!!
От: Шахтер Интернет  
Дата: 14.05.20 18:13
Оценка: :)
Не прошло и 20 лет!!!

The value of E1 >> E2 is E1/2^E2, rounded down. [Note: E1 is right-shifted E2 bit positions. Right-shift on
signed integral types is an arithmetic right shift, which performs sign-extension.
—end note]

В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re: Аллилуйя C++20 !!!
От: andyp  
Дата: 14.05.20 22:02
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>Не прошло и 20 лет!!!


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

Она обычно в таких местах используется, где просто полагаться на то, что оптимизатор заменит деление как-то не очень хочется.
Re: Аллилуйя C++20 !!!
От: Marty Пират  
Дата: 14.05.20 22:18
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>Не прошло и 20 лет!!!


Ш>

Ш>The value of E1 >> E2 is E1/2^E2, rounded down. [Note: E1 is right-shifted E2 bit positions. Right-shift on
Ш>signed integral types is an arithmetic right shift, which performs sign-extension.
—end note]



А в чем цимес?
Вам как-бы показали сцыкливое мурло российской оппозиции — вот оно
Автор: Министр Промышленности
Дата: 17.10.19
!
Re: Аллилуйя C++20 !!!
От: Videoman Россия http://www.htsproduction.com/
Дата: 14.05.20 22:25
Оценка: +1
Здравствуйте, Шахтер, Вы писали:

Ш>Не прошло и 20 лет!!!


Ш>

Ш>The value of E1 >> E2 is E1/2^E2, rounded down. [Note: E1 is right-shifted E2 bit positions. Right-shift on
Ш>signed integral types is an arithmetic right shift, which performs sign-extension.
—end note]


Все клёво конечно, но -1 >> 1 (минус один сдвинутый вправо с расширением знака) = -1. Как это будет работать как знаковое деление или как ASR ?
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Re[2]: Аллилуйя C++20 !!!
От: Erop Россия  
Дата: 15.05.20 05:39
Оценка: +1
Здравствуйте, Videoman, Вы писали:

Ш>>

Ш>>The value of E1 >> E2 is E1/2^E2, rounded down.


V>Все клёво конечно, но -1 >> 1 (минус один сдвинутый вправо с расширением знака) = -1. Как это будет работать как знаковое деление или как ASR ?

Дык (-1) / 32, округлённой ВНИЗ -- это же снова -1 и есть?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Аллилуйя C++20 !!!
От: Шахтер Интернет  
Дата: 15.05.20 10:05
Оценка: -1
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, Шахтер, Вы писали:


Ш>>Не прошло и 20 лет!!!


Ш>>

Ш>>The value of E1 >> E2 is E1/2^E2, rounded down. [Note: E1 is right-shifted E2 bit positions. Right-shift on
Ш>>signed integral types is an arithmetic right shift, which performs sign-extension.
—end note]



M>А в чем цимес?


В том, что раньше это было unspecified.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re: Аллилуйя C++20 !!!
От: flаt  
Дата: 15.05.20 10:45
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>Не прошло и 20 лет!!!


А по сабжу: С++20 вышел или как?

The standard is expected to be officially published after the end of the DIS ballot in May 2020.


P.S. И поною: народ совсем перестал следить за информационными названиями темы, даже в профильных форумах
Re[3]: Аллилуйя C++20 !!!
От: Marty Пират  
Дата: 15.05.20 12:07
Оценка:
Здравствуйте, Шахтер, Вы писали:

M>>А в чем цимес?


Ш>В том, что раньше это было unspecified.


А-а-а.
Не могу припомнить, когда бы мне надо было сдвигать знаковые
Вам как-бы показали сцыкливое мурло российской оппозиции — вот оно
Автор: Министр Промышленности
Дата: 17.10.19
!
Re[3]: Аллилуйя C++20 !!!
От: σ  
Дата: 15.05.20 12:45
Оценка:
Ш>>>Не прошло и 20 лет!!!

Ш>>>

Ш>>>The value of E1 >> E2 is E1/2^E2, rounded down. [Note: E1 is right-shifted E2 bit positions. Right-shift on
Ш>>>signed integral types is an arithmetic right shift, which performs sign-extension.
—end note]



M>>А в чем цимес?


Ш>В том, что раньше это было unspecified.




[expr.shift]/3> The value of E1 >> E2 is E1 right-shifted E2 bit positions. ... If E1 has a signed type and a negative value, the resulting value is implementation-defined.

https://timsong-cpp.github.io/cppwp/n4659/defns.impl.defined
https://timsong-cpp.github.io/cppwp/n4659/defns.unspecified
Re[3]: Аллилуйя C++20 !!!
От: Videoman Россия http://www.htsproduction.com/
Дата: 15.05.20 14:48
Оценка:
Здравствуйте, Erop, Вы писали:

E>Дык (-1) / 32, округлённой ВНИЗ -- это же снова -1 и есть?


Чего-то я запутался. Я рассматриваю знакомый сдвиг вправо в контексте оптимизации деления на 2:
-8 / 2 == -4
-4 / 2 == -2
-2 / 2 == -1
-1 / 2 == 0 ???
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Re[4]: Аллилуйя C++20 !!!
От: Erop Россия  
Дата: 15.05.20 14:57
Оценка:
Здравствуйте, Videoman, Вы писали:

E>>Дык (-1) / 32, округлённой ВНИЗ -- это же снова -1 и есть?


V>Чего-то я запутался. Я рассматриваю знакомый сдвиг вправо в контексте оптимизации деления на 2:

Как ты понимаешь "округлённый вниз"?

V>-1 / 2 == 0 ???


-1 / 2 = -0.5 =округляем вниз=> -1

Какой шаг не понятен?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Аллилуйя C++20 !!!
От: Videoman Россия http://www.htsproduction.com/
Дата: 15.05.20 15:55
Оценка:
Здравствуйте, Erop, Вы писали:

E>-1 / 2 = -0.5 =округляем вниз=> -1


E>Какой шаг не понятен?


Если вниз — все ясно.

-5 / 2 = ???

Я не понимаю почему из всех возможных округлений вы рассматриваете именно вниз?
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Re[6]: Аллилуйя C++20 !!!
От: σ  
Дата: 15.05.20 16:04
Оценка:
V>Я не понимаю почему из всех возможных округлений вы рассматриваете именно вниз?
Потому что стандарт такое требует?
Re[7]: Аллилуйя C++20 !!!
От: Videoman Россия http://www.htsproduction.com/
Дата: 15.05.20 16:09
Оценка: +1
Здравствуйте, σ, Вы писали:

V>>Я не понимаю почему из всех возможных округлений вы рассматриваете именно вниз?

σ>Потому что стандарт такое требует?
Ок, понял. Еще раз перечитал. Оказывается это по стандарту так нужно. Спасибо вам!
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Re[6]: Аллилуйя C++20 !!!
От: Erop Россия  
Дата: 15.05.20 17:45
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Я не понимаю почему из всех возможных округлений вы рассматриваете именно вниз?


Потому, что так было написано а процитированном в стартовом сообщении стандарте, или не знаю, что там цитировали...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: Аллилуйя C++20 !!!
От: Videoman Россия http://www.htsproduction.com/
Дата: 15.05.20 19:51
Оценка: +1
Здравствуйте, Erop, Вы писали:

E>Потому, что так было написано а процитированном в стартовом сообщении стандарте, или не знаю, что там цитировали...


Меня просто сбила логика стандарта. Я имею ввиду следующий код:
int n = ...
while (n < 0) {

  // do something

  n = n >> 1;
}

т.к. раньше поведение было неопределенным, обычно знаковые типы так не использовали, а теперь будет куча вопросов на StackOverflow — почему это не эквивалент такого кода:
int n = ...
while (n < 0) {

  // do something

  n = n / 2;
}

и почему цикл со сдвигами теперь стал бесконечным !!!
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Re[8]: Аллилуйя C++20 !!!
От: σ  
Дата: 15.05.20 19:56
Оценка:
E>>Потому, что так было написано а процитированном в стартовом сообщении стандарте, или не знаю, что там цитировали...

V>Меня просто сбила логика стандарта. Я имею ввиду следующий код:

V>
V>int n = ...
V>while (n < 0) {

V>  // do something

V>  n = n >> 1;
V>}
V>

V>т.к. раньше поведение было неопределенным

implementation-defined
Re[9]: Аллилуйя C++20 !!!
От: Videoman Россия http://www.htsproduction.com/
Дата: 15.05.20 20:57
Оценка:
Здравствуйте, σ, Вы писали:

σ>implementation-defined


Блин, я ж написал — применительно к новому С++ 20 стандарту.
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Re[10]: Аллилуйя C++20 !!!
От: σ  
Дата: 15.05.20 21:01
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Здравствуйте, σ, Вы писали:


σ>>implementation-defined


V>Блин, я ж написал — применительно к новому С++ 20 стандарту.


Теперь я вообще ничего не понимаю.
Re[11]: Аллилуйя C++20 !!!
От: Videoman Россия http://www.htsproduction.com/
Дата: 15.05.20 21:42
Оценка:
Здравствуйте, σ, Вы писали:

σ>Теперь я вообще ничего не понимаю.


Как я понял в c++ 20 теперь операция правого сдвига (>>) определена по стандарту. Теперь это не просто зависит от платформы, а конкретная операция деление на 2 в заданной степени с округлением вниз. Во всяком случае я так понял новость.
Теперь получается что для знаковых целых:
n = n >> 1;
n = n / 2;

— это две разные операции.
Может быть есть разумные причины почему это должно давать разные результаты, но на мой взгляд, лучше если бы если бы это было одной и той же операцией по стандарту.
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.