main() {
if ( -1 < (unsigned char) 1 )
printf("less than");
else
printf("NOT less than");
}
Отпечатки less than
.Поскольку (unsigned char) 1
преобразуется в (signed char) 1
, а затем: (signed) -1 < (signed) 1
, таким образом, вывод составляет less than
.
Но если я изменю код выше на if ( (-1 < (unsigned int) 1 )
, тогда вывод будет NOT less than
.
Так что очевидно, что когда я заменяю unsigned char на unsigned int:
- (подписано) -1 преобразуется в unsigned int [происходит прямо противоположное]
- , поскольку -1 сохраняется как комплимент 2 для 1;битовый шаблон оценивается как 255 (вероятно)
- , поэтому 255 <1 будет оцениваться как false, а в противном случае будет выполняться. </li>
- , даже если вместо '-1' подставить
int a = -1;
тот же результат
Вопросы:
во время арифметики со знаком и без знака ... как быть уверенным, что подпись будет преобразована в без знака или наоборот.
почему для арифметики различается преобразование между unsigned char и char: по-видимому, unsigned преобразуется в unsigned и unsigned int и int: по-видимому, unsigned конвертируется в unsigned
PS: я знаю, что это не зависит от компилятора .. поэтому не говорите, что это так.