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

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

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

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

16.12.2011, 21:34. Просмотров 2656. Ответов 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", так как числа будут интерпретироваться с учетом знака.

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

Генератор 4-знаковых чисел - C++
Добрый день, написал генератор , генерирует числа с 4 знаками. Подскажите , как дописать проверку этих чисел, чтобы все знаки в числе...

Изменение бит в массиве беззнаковых целых чисел - C++
В массиве без знаковых целых 32- разрядных чисел поменять зеркально биты у тех чисел, старший байт которых можно интерпретировать как...

Перевод знаковых 4-х байтовых чисел в различные системы счисления - C++
Пример программы: // Программа преобразует однобайтовое целое число из десятичной // или шестнадцатеричной системы счисления в...

Найти сумму двух не знаковых чисел, а затем провести операцию побитового «И» над суммой и вторым числом - C++
Два не знаковых целых числа вводятся с клавиатуры в десятичной системе исчисления. Найти их сумму, а затем провести операцию побитового «И»...

Класс "Массив беззнаковых целых чисел" - C++
Нужно создать класс содержащий динамический массив беззнаковых целых чисел.

Переполнение знаковых целых чисел: почему значение переменной обнуляется, а не записывается младшее значение? - C++
что то не пойму, как происходит переполнение знаковых целых чисел вот #include &lt;iostream&gt; int main(int argc, char* argv) { ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
16.12.2011, 22:22 #2
Ну, здесь производится арифметическое преобразование типов, согласно которому операнд "меньшего" типа приводится к типу операнда "большего" типа. В иерархии типов "большим" считается тот тип, который может представить большее положительное значение.
2
yekka
385 / 149 / 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");
}
А то, что отрицательные числа так топорно кастуются в беззнаковые -- это типа фича языка си.
0
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
17.12.2011, 11:05 #4
Цитата Сообщение от yekka Посмотреть сообщение
Насколько я понимаю, -1 в памяти хранится как FF FF FF FF
Да, так и есть. Но при сравнении все привелось к "большему" типу. Т.е. к беззнаковому, и теперь представте, что превый бит трактуется не как знак, а как число...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2011, 11:05
Привет! Вот еще темы с ответами:

Сравнение чисел - C++
Есть у меня 2 числа: 3.1000000000000017 и 3.1000000000000000 Они как бы равны, но не получается их в блоке if сравнить. Как их...

Сравнение чисел - C++
Привет всем!Люди помогите написать программ,которая сравнивает три числа и выдает наибольшее и наименьшее из них.Задача из книги Дейтелов. ...

Сравнение чисел - C++
Скажите, пожалуйста, логику сравнения трёх чисел на языке алгоритма, чтобы рез-т был таким: первое &gt; второе &gt; третье

Сравнение чисел - C++
дан 40 число если число меньше 25 надо прибавить 10. можете помочь


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.12.2011, 11:05
Ответ Создать тему
Опции темы

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