Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 15.10.2019
Сообщений: 6

Почему результат сравнения int и unsigned int равен 1?

16.10.2019, 17:25. Показов 4257. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему результат сравнения в выводе равен 1?

C
1
2
        int i = -5; unsigned u = 5;
    printf("int and unsigned int -5>5 : %d\n", i > u);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.10.2019, 17:25
Ответы с готовыми решениями:

Как преобразовать int в unsigned int
Подскажите, как преобразовать int в unsigned int в языке C. Пробовал так: int sum; sum = (unsigned int) sum; Но...

Error C2040:strnset_2:"char *(char *,int,unsigned int)" отличается по уровням косвенного обращения от "int ()"
Не могу найти в чём ошибка. error C2040: strnset_2: "char *(char *,int,unsigned int)" отличается по уровням косвенного обращения от...

Результат сравнения signed и unsigned
Добрый день! Помогите, пожалуйста, разобраться. Почему при сравнении этих переменных выдает ложь: char c=-5; unsigned char uc=5; ...

6
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,069
16.10.2019, 17:34
Nolifeleftt, а компилятор предупреждение никакое не написал ?
0
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,857
Записей в блоге: 15
16.10.2019, 19:34
Скорее всего просто не воспринимает операцию сравнения для разных типов данных. Если сравнивать однотипные данные, тогда результат будет верным и равен нулю.
C++
1
2
int i = -5, u = 5;
printf("int and unsigned int -5>5 : %d\n", i > u);
0
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,069
16.10.2019, 19:42
мама Стифлера, компилятор в таком случае намекает, что мол

предупреждение: comparison between signed and unsigned integer expressions

но при этом, похоже, сравнивает так unsigned int(-5)>unsigned int(5) , то есть 0xFFFFFFFB > 0x00000005, что является true, а, в свою очередь, int(true)==1
0
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,857
Записей в блоге: 15
16.10.2019, 20:00
Алексей1153, да я совсем новичок ))) просто интересно анализировать и пытаться разобраться самостоятельно. И кстати пока экспериментирую только на Dev-C++ v5.11, компилятор ошибок не выдал.
0
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,069
16.10.2019, 21:09
мама Стифлера, не ошибку, а предупреждение
0
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,857
Записей в блоге: 15
16.10.2019, 21:41
Цитата Сообщение от Алексей1153 Посмотреть сообщение
предупреждение: comparison between signed and unsigned integer expressions
типа это не ошибка, а только предупреждение что сравниваются минусовое и плюсовое значения.
Поэкспериментировал только с положительными числами и в таком случае результат получается верный, при таком же разном типе данных.

Добавлено через 20 минут
Нашел нормальный вразумительный ответ:
Кликните здесь для просмотра всего текста
William Astle
December 1, 2017 at 10:16 pm

On most architectures, you’ll get the same results. That’s because most architectures are using two’s complement representation of integers. If you do a naïve cast from signed to unsigned (that is, don’t check for negative first and just treat the bit pattern as a positive number), all negative numbers will be greater than all positive numbers. Note that the same thing should happen even on a 6809.

As you discovered, there’s a really good reason for the signed/unsigned warnings.

The problem here is actually in the C language itself, though. Comparing signed and unsigned *should* be safe and it can be implemented. However, the code for that gets messy and in many cases isn’t actually needed (say if the programmer knows the domain of the signed value will never be negative).

Instead, C went the way that made things easier for the compiler. I think originally casting a negative to unsigned was just “undefined” which means that compiler can technically do anything including emit code to format your hard drive. Most compiler writers just went for the easy thing – treat the bits of the signed value as unsigned. And, poof! You get the behaviour you discovered. Newer C specifications may have made that behaviour more explicit.

Actually, there is a *lot* of stuff in C that is undefined but which any reasonable programmer would expect to behave sensibly. That’s partly why older code generates so many warnings on modern compilers. Compilers have been getting a lot better at warning about undefined behaviours.

ссылка на источник https://subethasoftware.com/20... ment-30132
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.10.2019, 21:41
Помогаю со студенческими работами здесь

Unsigned int во float
Всем привет! Я собираю устройство на контроллере, которое получает двухбайтовый код и мне нужно сравнивать этот код с каким-либо целым...

Перевод массива unsigned char в число типа int
Добрый день всем! Есть массив, который заполняется трехзначным числом, введенным с клавиатуры (UART_ComBody), надо перевести его в число...

Не умещается значение = 4млрд, в переменной типа unsigned long int
Всем привет. В Си я новичек. Пользуюсь VS6. Написал вот это: #include <stdio.h> main() { unsigned long int i; i =...

Определение диапазонов переменных типов char, short, int и long (как signed, так и unsigned)
Вроде до этого все читал внимательно, задание понимаю, как реализовать - не знаю. С только начал изучать :)

Файл: Необходимо считать символы из файла и записать в массив unsigned int array[2]. Не подскажите как это сделать?
Итак, есть файл. В нем записано восемь символов по одному байту, мне нужно считать их и записать в массив unsigned int array. Не подскажите...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru