Еще не упоминалось о том, что стандарт явно допускает возможность того, что целочисленные представления могут содержать биты заполнения. Лично я хотел бы, чтобы комитет по стандартам предоставил программе простой и удобный способ указать определенные ожидаемые поведения и потребовал, чтобы любой компилятор либо соблюдал такие спецификации, либо отказывался от компиляции; код, который начинается со спецификации "целые числа не должны иметь битов заполнения", будет иметь право предполагать, что это так.
Как таковое, было бы вполне законно (хотя и нечетно) для реализации хранить 35-битные long
значения в виде четырех 9-битных символов в формате с прямым порядком байтов, но использовать младший бит первого байта в качестве бит четности. При такой реализации сохранение 1
в long
может привести к тому, что четность всего слова станет нечетной, что вынудит реализацию сохранить 1
в бит четности.
Конечно, такое поведение было бы странным, но если архитектуры, использующие заполнение, достаточно заметны, чтобы оправдать явные положения в стандарте, код, который нарушает такие архитектуры, действительно нельзя считать действительно «переносимым».
Код, использующий union
, должен корректно работать на всех архитектурах, которые можно просто описать как "big-endian" или "little-endian", и не использовать биты заполнения. Это было бы бессмысленно на некоторых других архитектурах (и действительно, термины «с прямым порядком байтов» и «с прямым порядком байтов» тоже могли бы быть бессмысленными).