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]
Здравствуйте, Шахтер, Вы писали:
Ш>Не прошло и 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 ?
Ш>>The value of E1 >> E2 is E1/2^E2, rounded down.
V>Все клёво конечно, но -1 >> 1 (минус один сдвинутый вправо с расширением знака) = -1. Как это будет работать как знаковое деление или как ASR ?
Дык (-1) / 32, округлённой ВНИЗ -- это же снова -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]
Здравствуйте, σ, Вы писали:
V>>Я не понимаю почему из всех возможных округлений вы рассматриваете именно вниз? σ>Потому что стандарт такое требует?
Ок, понял. Еще раз перечитал. Оказывается это по стандарту так нужно. Спасибо вам!
Здравствуйте, Erop, Вы писали:
E>Потому, что так было написано а процитированном в стартовом сообщении стандарте, или не знаю, что там цитировали...
Меня просто сбила логика стандарта. Я имею ввиду следующий код:
int n = ...
while (n < 0) {
// do something
n = n >> 1;
}
т.к. раньше поведение было неопределенным, обычно знаковые типы так не использовали, а теперь будет куча вопросов на StackOverflow — почему это не эквивалент такого кода:
int n = ...
while (n < 0) {
// do something
n = n / 2;
}
и почему цикл со сдвигами теперь стал бесконечным !!!
Здравствуйте, Шахтер, Вы писали:
Ш>Не прошло и 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]
Ш>>>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.
Здравствуйте, Videoman, Вы писали:
E>>Дык (-1) / 32, округлённой ВНИЗ -- это же снова -1 и есть?
V>Чего-то я запутался. Я рассматриваю знакомый сдвиг вправо в контексте оптимизации деления на 2:
Как ты понимаешь "округлённый вниз"?
V>-1 / 2 == 0 ???
-1 / 2 = -0.5 =округляем вниз=> -1
Какой шаг не понятен?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Videoman, Вы писали:
V>Я не понимаю почему из всех возможных округлений вы рассматриваете именно вниз?
Потому, что так было написано а процитированном в стартовом сообщении стандарте, или не знаю, что там цитировали...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
E>>Потому, что так было написано а процитированном в стартовом сообщении стандарте, или не знаю, что там цитировали...
V>Меня просто сбила логика стандарта. Я имею ввиду следующий код: V>
V>int n = ...
V>while (n < 0) {
V> // do something
V> n = n >> 1;
V>}
V>
Здравствуйте, Videoman, Вы писали:
V>Здравствуйте, σ, Вы писали:
σ>>implementation-defined
V>Блин, я ж написал — применительно к новому С++ 20 стандарту.
Здравствуйте, σ, Вы писали:
σ>Теперь я вообще ничего не понимаю.
Как я понял в c++ 20 теперь операция правого сдвига (>>) определена по стандарту. Теперь это не просто зависит от платформы, а конкретная операция деление на 2 в заданной степени с округлением вниз. Во всяком случае я так понял новость.
Теперь получается что для знаковых целых:
n = n >> 1;
n = n / 2;
— это две разные операции.
Может быть есть разумные причины почему это должно давать разные результаты, но на мой взгляд, лучше если бы если бы это было одной и той же операцией по стандарту.
Здравствуйте, Videoman, Вы писали:
V>Здравствуйте, Erop, Вы писали:
E>>-1 / 2 = -0.5 =округляем вниз=> -1
E>>Какой шаг не понятен?
V>Если вниз — все ясно.
V>-5 / 2 = ???
V>Я не понимаю почему из всех возможных округлений вы рассматриваете именно вниз?
Это требует стандарт.
Это точно соответствует команде sar.
Здравствуйте, Videoman, Вы писали:
V>Теперь получается что для знаковых целых: V>
V>n = n >> 1;
V>n = n / 2;
V>
V>- это две разные операции. V>Может быть есть разумные причины почему это должно давать разные результаты, но на мой взгляд, лучше если бы если бы это было одной и той же операцией по стандарту.
Это всегда были разные операции с разным результатом.