Как вы объясните, что строка 7 получает предупреждение, но не строка 5 или строка 6?
int main()
{
unsigned char a = 0xFF;
unsigned char b = 0xFF;
a = a | b; // 5: (no warning)
a = (unsigned char)(b & 0xF); // 6: (no warning)
a = a | (unsigned char)(b & 0xF); // 7: (warning)
return 0;
}
Выход GCC 4.6.2 при компиляции в 32-разрядной архитектуре (ПК с ОС Windows):
gcc -c main.c --std=c89 -Wall -Wextra -Wconversion -pedantic
main.c: In function 'main':
main.c:7:11: warning: conversion to 'unsigned char' from 'int' may alter its value [-Wconversion]
Если это поможет вам понять мой вопрос, вот как я вижу это (возможно, неверно!):
Я полагаю, что на 32-битной машине операции выполняются на 32-битных номерах. Поскольку unsigned char
вписывается в 32-разрядный int
, результат операции 32-бит int
. Но поскольку GCC не дает предупреждений на строках 5 и 6, я думаю, что происходит что-то еще:
строка 5: Показатели GCC, которые (uchar) ИЛИ (uchar) никогда не больше MAX (uchar), поэтому никаких предупреждений.
строка 6: Показатели GCC, которые (uchar) и 0xF никогда не больше MAX (uchar), поэтому никаких предупреждений. Явный приведение не требуется.
строка 7: Основываясь на вышеприведенных предположениях: И не должен давать предупреждения (начиная с строки 6), ИЛИ не должен давать предупреждения (начиная с строки 5).
Я предполагаю, что моя логика там где-то виновата. Помогите мне понять логику компилятора.