Я сделаю дополнительное предположение, что ни один тип не имеет битов заполнения в обсуждаемой реализации.Давайте рассмотрим их по одному:
unsigned u = 0xffffffff;
if (u == 4294967295) /* do something */
Да.
int i = 0xffffffff;
if (i == -1) /* do something */
Нет.Преобразование числа вне диапазона в тип со знаком дает результат, определенный реализацией.
unsigned u = (int)0xffffffff;
if (u == 0xffffffff) /* do something */
Нет, та же причина, что и в предыдущем примере.
int i = hex_literal;
unsigned u;
memcpy (&u, &i, sizeof (u));
if (i == u) /* do something */
if ((i & 0x7fffffff) == (u & 0x7fffffff)) /* do something */
Да.Стандарт гарантирует, что каждый бит значения в типе со знаком имеет одинаковое значение в объектном представлении соответствующего типа без знака.
int i = hex_literal;
unsigned u = i;
if (i == u) /* do something */
Да.Повышение i
с int
до unsigned
является детерминированным и дает одинаковое значение как в присваивании u
, так и в сравнении.
unsigned u = hex_literal;
int i = u;
if (i == u) /* do something */
Да, но только если hex_literal
находится в диапазоне (положительных) значений, представляемых int
- в противном случае результат, определенный реализацией, снова наносит удар.
int i = hex_literal;
unsigned u = hex_literal;
if (i == hex_literal && u == hex_literal) /* do something */
u == hex_literal
всегда будет иметь значение true, но i == hex_literal
нужно толькосделайте это, если hex_literal
находится в диапазоне значений, представляемых int
.
char c = 0xff;
if (c >> 4 == 0xf) /* do something */
char
может быть подписано или не подписано.Если он не подписан, то тест будет верным;если подписано, то c
и c >> 4
будут иметь значения, определенные реализацией, поэтому это может быть неверно.
signed char c = 0xff;
if (((c >> 4) & 0xff) == 0xf) /* do something */
c
будет иметь значение, определяемое реализацией, поэтому тест может не иметь значениябыть правдой.
Обратите внимание, что все ваши вопросы, кроме memcpy()
, относятся только к значениям , а не к представлению .