Существует ли заметная разница при использовании `unsigned long` и `unsigned int` в C (или C++), когда оба типа имеют ширину 32 бита?

Я использую MPC56XX (встроенные системы) с компилятором, для которого int и long имеют ширину 32 бита.

В требуемом программном пакете у нас были следующие определения для типов шириной 32 бита:

typedef   signed int sint32;
typedef unsigned int uint32;

В новом релизе это было изменено без особой документации на:

typedef   signed long sint32;
typedef unsigned long uint32;

Я вижу, почему это было бы хорошо: у целых чисел есть ранг преобразования между short и long, так что теоретически дополнительные преобразования могут применяться при использовании первого набора определений.

Мой вопрос: Учитывая вышеуказанное изменение, навязанное нам авторами пакета, можно ли представить себе ситуацию, когда такое изменение изменит скомпилированный код, корректно приведя к другому результату?

Я знаком с "обычными унарными преобразованиями" и "обычными двоичными преобразованиями", но мне трудно придумать конкретную ситуацию, когда это действительно могло бы испортить мой существующий код. Но действительно ли это неважно?

В настоящее время я работаю в среде чистого C, используя C89/C94, но мне были бы интересны вопросы как C, так и C++.

EDIT: Я знаю, что смешивание int с sint32 может дать разные результаты при переопределении. Но нам не разрешено использовать оригинальные типы C напрямую, только типизированные.
Я ищу пример (выражение или фрагмент), использующий константы, унарные/бинарные операторы, приведения и т.д. с другим, но правильным результатом компиляции на основе измененного определения типа.

9
задан Johan Bezem 8 December 2011 в 12:16
поделиться