В C и С++ поведение сглаженного целочисленного переполнения или нижнего потока undefined.
В Java и С# (непроверенные контексты) поведение, по-видимому, определяется в определенной степени.
Из спецификации Java мы имеем:
Целочисленные операторы никак не указывают на переполнение или недополнение.
и
Язык программирования Java использует двухзначное представление для целых чисел [...]
Из спецификации С# мы имеем:
[...] В неконтролируемом контексте переполнения игнорируются, а любые старшие разряды, не соответствующие типу назначения, отбрасываются.
Проверяя оба, я получил ожидаемый результат обхода. Судя по формулировке спецификаций, у меня возникает ощущение, что в Java результат переносимый (потому что язык требует представления с двумя дополнениями), в то время как С# может иметь или не иметь такого результата (поскольку он не указывает на представление - только то, что биты более высокого порядка отбрасываются).
Таким образом, оба языка гарантируют одинаковое поведение на всех платформах (только с другой формулировкой)? Или они просто оказываются одинаковыми друг с другом в моем тестовом примере (на x86 и под Sun JRE и Microsoft.NET), но теоретически могут отличаться в других архитектурах или реализациях?