Повышение типа данных во время арифметических операций: -1 <(unsinged int) 1 == false

main()  {   
  if ( -1 < (unsigned char) 1 )
    printf("less than");
  else        
    printf("NOT less than");
} 

Выводит меньше, чем . Поскольку (символ без знака) 1 преобразуется в (знаковый символ) 1 , а затем: (знаковый) -1 <(знаковый) 1 , таким образом, вывод будет меньше, чем .

Но если я изменю приведенный выше код на if ((-1 <(unsigned int) 1)

, то результат будет НЕ меньше чем .

Итак, очевидно, что когда я меняю unsigned char на unsigned int:

  • (signed) -1 преобразуется в unsigned int [происходит прямо противоположное]
  • , поскольку -1 сохраняется как 2 дополнение 1; битовый шаблон оценивается как 255 (вероятно)
  • , таким образом, 255 <1 будет оцениваться как false, а иначе будет выполнено.
  • , даже если вы замените int a = -1; вместо '-1' тот же результат

Вопросы:

  1. во время арифметики со знаком и без знака ... как быть уверенным, что знак будет преобразован в беззнаковый или наоборот.

  2. почему преобразование отличается для арифметики между unsigned char и char: очевидно, что unsigned преобразуется в знаковый и беззнаковый int и int: очевидно, подписанный - это преобразователь в беззнаковый

PS: Я знаю, что это не зависит от компилятора ... поэтому не говорите, что это так.

10
задан Flow 14 August 2015 в 08:15
поделиться