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