Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.79
yekka
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
#1

сравнение знаковых и беззнаковых чисел - C++

16.12.2011, 21:34. Просмотров 2451. Ответов 3
Метки нет (Все метки)

Возьмем пример:
C++
1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main() {
  if ( 1U > -1 ) 
    printf("1 > -1");
  else
    printf("1 <= -1\n");
}
Как бы абсурдно это не выглядело, но результатом выполнения этой программы будет строка "1 <= -1".
Насколько я понимаю, -1 в памяти хранится как FF FF FF FF и если интерпретировать такую последовательность битов как беззнаковое число, то оно, естественно, будет больше единицы. Но если убрать из этого примера буковку 'U', то последовательности сравниваемых битов останутся совершенно теми же, но получим теперь уже "верный" результат "1 > -1", так как числа будут интерпретироваться с учетом знака.

И вот что мне совершенно непонятно, так это почему в языке выбрано именно такое неочевидное и провоцирующее ошибки поведение при сравнении знаковых и беззнаковых целых чисел?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2011, 21:34     сравнение знаковых и беззнаковых чисел
Посмотрите здесь:

Сравнение чисел. C++
Сравнение чисел C++
C++ Генератор 4-знаковых чисел
C++ Сравнение 3 чисел
Сравнение чисел C++
C++ Сравнение чисел
C++ Изменение бит в массиве беззнаковых целых чисел
C++ Переполнение знаковых целых чисел: почему значение переменной обнуляется, а не записывается младшее значение?
Битовое сравнение чисел C++
Класс "Массив беззнаковых целых чисел" C++
Найти сумму двух не знаковых чисел, а затем провести операцию побитового «И» над суммой и вторым числом C++
Перевод знаковых 4-х байтовых чисел в различные системы счисления C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mr.X
Эксперт С++
3039 / 1684 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
16.12.2011, 22:22     сравнение знаковых и беззнаковых чисел #2
Ну, здесь производится арифметическое преобразование типов, согласно которому операнд "меньшего" типа приводится к типу операнда "большего" типа. В иерархии типов "большим" считается тот тип, который может представить большее положительное значение.
yekka
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
17.12.2011, 09:38  [ТС]     сравнение знаковых и беззнаковых чисел #3
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, здесь производится арифметическое преобразование типов, согласно которому операнд "меньшего" типа приводится к типу операнда "большего" типа. В иерархии типов "большим" считается тот тип, который может представить большее положительное значение.
Хм. Действительно, если отрицательное число будет "большего" типа, то результат получается "правильный".
C++
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <stdint.h>
 
int main() {
  if ( (uint32_t) 1 > (int64_t) -1 ) 
    printf("1 > -1\n");
  else
    printf("1 <= -1\n");
}
А то, что отрицательные числа так топорно кастуются в беззнаковые -- это типа фича языка си.
go
Эксперт C++
3585 / 1365 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
17.12.2011, 11:05     сравнение знаковых и беззнаковых чисел #4
Цитата Сообщение от yekka Посмотреть сообщение
Насколько я понимаю, -1 в памяти хранится как FF FF FF FF
Да, так и есть. Но при сравнении все привелось к "большему" типу. Т.е. к беззнаковому, и теперь представте, что превый бит трактуется не как знак, а как число...
Yandex
Объявления
17.12.2011, 11:05     сравнение знаковых и беззнаковых чисел
Ответ Создать тему
Опции темы

Текущее время: 06:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru