Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
 Аватар для aldr
-16 / 0 / 0
Регистрация: 14.04.2022
Сообщений: 82

Почему положительное меньше чем отрицательное?

24.09.2022, 18:49. Показов 2195. Ответов 38

Author24 — интернет-сервис помощи студентам
почему отрицательное значение int больше чем положительное значение unsigned


C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdlib.h>
#include <stdio.h>
 
int main()
{
    unsigned c;
    int a;
    a = -110;
    c = 11111;
    printf("a>c:%d", a > c);
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.09.2022, 18:49
Ответы с готовыми решениями:

Минимальное положительное и максимальное отрицательное
Здравствуйте, код работает некорректно, помогите, пожалуйста исправить Дан массив A из N целых чисел. Найти и вывести минимальное...

Минимальное положительное и максимальное отрицательное
Дан массив A из N целых чисел. Найти и вывести минимальное положительное и максимальное отрицательное числа в этом массиве. Input В...

Найти минимальное положительное и максимальное отрицательное в массиве
Дан массив A из N целых чисел. Найти и вывести минимальное положительное и максимальное отрицательное числа в этом массиве. Input В...

38
383 / 280 / 112
Регистрация: 28.04.2015
Сообщений: 1,724
24.09.2022, 19:05
имхо

в выражении a > c разные типы
все приведется к беззнаковому типу, т е к unsigned

в результате, если взять, что типа unsigned 4байтовый, то будет такое сравнение
a > c
232 - 110 > 11111 - true

зы: а может все совсем не так...
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12873 / 6737 / 1810
Регистрация: 18.10.2014
Сообщений: 17,057
24.09.2022, 21:24
Цитата Сообщение от aldr Посмотреть сообщение
почему отрицательное значение int больше чем положительное значение unsigned
В языке С нет сравнений между разными типами. Невозможно сравнить int и unsigned. Типы в сравнении предварительно неявно приводятся к одному общему типу. В данном случае общим типом будет тип unsigned. То есть никакого "отрицательное больше чем положительное" тут нет. Сравниваются два положительных значения типа unsigned.
0
Злостный нарушитель
 Аватар для Verevkin
9847 / 5377 / 1225
Регистрация: 12.03.2015
Сообщений: 25,144
24.09.2022, 22:45
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В данном случае общим типом будет тип unsigned.
Тут сосед интересуется: а пачиму не int?
0
Злостный нарушитель
 Аватар для Verevkin
9847 / 5377 / 1225
Регистрация: 12.03.2015
Сообщений: 25,144
24.09.2022, 23:23
Я чот вот тоже заинтересовался.
Ты ж знаешь, что я в Сях не копенгаген, а работаю на более другом языке программирования. И этот язык как-то более логично себя ведёт.
Delphi Скопировано
1
2
3
4
5
6
7
8
program Hello;
 
var 
  a: int32  =  -110;
  c: uint32 = 11111;
begin
  writeln ('a > c: ', a > c);
end.
Почему положительное меньше чем отрицательное?

Вот почему так, а?
0
 Аватар для Наталья8
483 / 349 / 64
Регистрация: 09.03.2016
Сообщений: 3,453
25.09.2022, 00:14
Компилятор выдаёт предупреждения.
Разные типы ни кто не сравнивает.
Следовательно поведение не определено.
Хрен его знает, почему...
(Обойди проблему иначе)
Не надо их сравнивать.

Добавлено через 2 минуты
a = (unsigned int)-110;
Как вам такое?
0
Злостный нарушитель
 Аватар для Verevkin
9847 / 5377 / 1225
Регистрация: 12.03.2015
Сообщений: 25,144
25.09.2022, 00:19
Цитата Сообщение от Наталья8 Посмотреть сообщение
Как вам такое?
Ты объясни, пачиму сишный компайлер неявно приводит к unsigned, а паскальный - нет.
0
фрилансер
 Аватар для Алексей1153
6334 / 5473 / 1108
Регистрация: 11.10.2019
Сообщений: 14,568
25.09.2022, 00:20
Verevkin, где-то тут
0
Злостный нарушитель
 Аватар для Verevkin
9847 / 5377 / 1225
Регистрация: 12.03.2015
Сообщений: 25,144
25.09.2022, 00:23
Цитата Сообщение от Алексей1153 Посмотреть сообщение
где-то тут
А можна нинада?

0
 Аватар для Наталья8
483 / 349 / 64
Регистрация: 09.03.2016
Сообщений: 3,453
25.09.2022, 00:24
Почему положительное меньше чем отрицательное?
0
 Аватар для Наталья8
483 / 349 / 64
Регистрация: 09.03.2016
Сообщений: 3,453
25.09.2022, 00:28
Без приведения типов, то же самое.

Добавлено через 1 минуту
значение одно и тоже.
Представление разное.
А в паскале я ни чего не понимаю.

Добавлено через 1 минуту
Что лежит в ячейках памяти. Хочешь так, хочешь эдак.
0
Злостный нарушитель
 Аватар для Verevkin
9847 / 5377 / 1225
Регистрация: 12.03.2015
Сообщений: 25,144
25.09.2022, 00:29
Цитата Сообщение от Наталья8 Посмотреть сообщение
А в паскале я ни чего не понимаю.
0
 Аватар для Наталья8
483 / 349 / 64
Регистрация: 09.03.2016
Сообщений: 3,453
25.09.2022, 00:44
Ни чего он не приводил. Переложил из ячейки в ячейку.

Добавлено через 6 минут
Цитата Сообщение от aldr Посмотреть сообщение
почему отрицательное значение int больше чем положительное значение unsigned
Потому что минус стодесять в unsigned, это дохрена.
0
из племени тумба-юбма
 Аватар для мама Стифлера
2493 / 1815 / 418
Регистрация: 29.11.2015
Сообщений: 8,830
Записей в блоге: 15
25.09.2022, 02:50
Оригинал тут https://en.cppreference.com/w/... conversion а так, достаточно цитаты из последнего абзаца:
Integer promotions
Integer promotion is the implicit conversion of a value of any integer type with rank less or equal to rank of int or of a bit field of type _Bool, int, signed int, unsigned int, to the value of type int or unsigned int.

If int can represent the entire range of values of the original type (or the range of values of the original bit field), the value is converted to type int. Otherwise the value is converted to unsigned int.
Кликните здесь для просмотра всего текста

В довесок сделал явное преобразование типов, где видно как изменяются переменные
C Скопировано
1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main()
{
    int a = -110;
    unsigned c = 11111;
    printf("a>c: %s ", a>c ? "true" : "false");
    printf("= %d>%d or %u>%u\n", a, (int)c, (unsigned)a, c);
    return 0;
}
Code Скопировано
1
2
3
4
5
a>c: true = -110>11111 or 4294967186>11111
 
--------------------------------
Process exited after 0.2268 seconds with return value 0
Для продолжения нажмите любую клавишу . . .
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12873 / 6737 / 1810
Регистрация: 18.10.2014
Сообщений: 17,057
25.09.2022, 04:03
Цитата Сообщение от Verevkin Посмотреть сообщение
Тут сосед интересуется: а пачиму не int?
Эта тема разбирается на странице 44 "Rationale". Там приводятся какие-то (относительно неубедительные) аргументы не тему того, почему для intergral promotions при расширении типа был выбран вариант "к знаковому", а вот для usual arithmetic conversions при одинаковой ширине типов - "к беззнаковому". Ясно, что в последнем случае идеального решения без расширения типа тут быть не может - как ни сделай, будут примеры, в которых это приводит к неожиданным результатам.

Цитата Сообщение от Verevkin Посмотреть сообщение
Ты объясни, пачиму сишный компайлер неявно приводит к unsigned, а паскальный - нет.
Потому что С и Паскаль - разные языки.

В С++20 в стандартной библиотеке добавлены функции, выполняющие "безопасные" целочисленные сравнения

C++ Скопировано
1
2
3
4
5
6
cmp_equal
cmp_not_equal
cmp_less
cmp_greater
cmp_less_equal
cmp_greater_equal
В С вроде пока их аналогов не видно.
0
0 / 0 / 0
Регистрация: 25.09.2022
Сообщений: 25
25.09.2022, 09:00
Ответ в способе записи целых отрицательных чисел в компьютере — они записываются в [дополнительном коде](один из способов кодирования знаковых целых чисел), когда отрицательное число это [побитовое отрицание числа и инкремент этого числа(увеличение значения на единицу)].
//Пример: (-a) == ((~110)+1)
C Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
 
int main()
{
    setlocale(LC_ALL,"Russian");//подключаем русский язык для печати в консоли
    unsigned c;//машинный тип uint32_t(беззнаковый 32-битный целый)
    int a;     //машинный тип int32_t(знаковый 32-битный целый)
    a = -110;  //0b11111111@11111111@11111111@10010010 == 0xFFFFFF92
    c = 11111; //0b00000000@00000000@00101011@01100111 == 0x00002B67
    //знак @ только для удобства чтения и при забиси числа его нужно стереть
    printf("a=%d(в 10-ичной системе счисления) или %0.8X(в 16-ичной системе счисления)\n", a,a);
    printf("с=%d(в 10-ичной системе счисления) или %0.8X(в 16-ичной системе счисления)\n", c,c);
    printf("(a > c) == %d", (a > c)); // здесь будет приведение типа к uint32_t(беззнаковый 32-битный целый) без пересчёта представления записи поэтому сравнение будет как если бы и a и c были uint32_t(беззнаковый 32-битный целый), тождественно (((uint32_t)a) > ((uint32_t)c))
 
    return 0;
}
//Компиляция проверена в Tiny C Сompilier(TCC) и GNU GCC Compilier
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12873 / 6737 / 1810
Регистрация: 18.10.2014
Сообщений: 17,057
25.09.2022, 09:07
Цитата Сообщение от proger0x8654 Посмотреть сообщение
Ответ в способе записи целых отрицательных чисел в компьютере — они записываются в [дополнительном коде](один из способов кодирования знаковых целых чисел), когда отрицательное число это [побитовое отрицание числа и инкремент этого числа(увеличение значения на единицу)].
Ответ - в спецификации языка С в таких случаях, а не в способе представления чисел.

Никакого принципиального отношения к способу представления чисел в компьютере это не имеет. Никто не мешает выполнить сравнение так, чтобы результат был "ожидаемым", независимо от способа представления чисел (как, например, это делает Паскаль).
0
Злостный нарушитель
 Аватар для Verevkin
9847 / 5377 / 1225
Регистрация: 12.03.2015
Сообщений: 25,144
25.09.2022, 10:50
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Потому что С и Паскаль - разные языки.
Спасибо тебе, прапорщик Очевидность! Я-то, дурак, думал, что одинаковые.
-------
Я тебе так скажу: при сравнении знакового и беззнакового в паскале происходит с преобразованием к "общему знаменателю" - более широкому знаковому типу. Компилятор справедливо от этом предупреждает:

Почему положительное меньше чем отрицательное?


Однако, если вручную сделать операнды сравнения 64-битными, то расширять их компилятору некуда. И сравниваются они как знаковые, без всяких ворнингов. ИЧСХ, результат сравнения - false, что мне кажется более правильным.

Почему положительное меньше чем отрицательное?


Почему положительное меньше чем отрицательное?


Я кончил и закурил.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12873 / 6737 / 1810
Регистрация: 18.10.2014
Сообщений: 17,057
25.09.2022, 11:19
Цитата Сообщение от Verevkin Посмотреть сообщение
Я тебе так скажу: при сравнении знакового и беззнакового в паскале происходит с преобразованием к "общему знаменателю" - более широкому знаковому типу.
Как я и сказал выше.

И, как я и сказал выше, в С такого не происходит.

Цитата Сообщение от Verevkin Посмотреть сообщение
Однако, если вручную сделать операнды сравнения 64-битными, то расширять их компилятору некуда. И сравниваются они как знаковые, без всяких ворнингов.
А в С - как беззнаковые. Добро пожаловать в С.

Цитата Сообщение от Verevkin Посмотреть сообщение
ИЧСХ, результат сравнения - false, что мне кажется более правильным.
Ну на таком "хорошем" примере - получается правильным. А сделай беззнаковое значение большим - результат получится "неправильным" по тем же причинам.
0
Злостный нарушитель
 Аватар для Verevkin
9847 / 5377 / 1225
Регистрация: 12.03.2015
Сообщений: 25,144
25.09.2022, 11:22
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А сделай беззнаковое значение большим - получится неправильным.
Оно жэж и так больше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.09.2022, 11:22
Помогаю со студенческими работами здесь

Машинная арифметика.Определить отрицательное(положительное) число
Здравствуйте! Помогите, пожалуйста, разобраться с одним вопросом. Мне необходимо определить, каким будет является числом результат...

Выяснить, какое число встречается раньше — положительное или отрицательное
Дана последовательность целых чисел a1, a2, ..., an. Выяснить, какое число встречается раньше - положительное или отрицательное. Не...

Выяснить, какое число встречается раньше — положительное или отрицательное
13.Дана последовательность целых чисел а1 а2,..., аn . Выяснить, какое число встречается раньше - положительное или отрицательное 14.*Найти...

Найти минимальное положительное и максимальное отрицательное числа, не входящие в вектор
В целочисленном векторе найти минимальное положительное и максимальное отрицательное числа, не входящие в этот вектор. Предусмотреть...

Определить, какое число введено пользователем: положительное, отрицательное или равное 0
Помогите пожалуйста написать программу (на языке Си), которое определяет какое введенное число введено пользователем положительное,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Работа с объемным DOM в javascript
Htext 04.04.2025
Сегодня прочитал статью тут о расходах памяти в JS, ее утечках и т. п. И вот что вспомнил из своей недавней практики. Может, кому пригодится. Хотя, в той статье об этом тоже есть. Дело в том, что я. . .
Оптимизация производительности Node.js с помощью кластеризации
run.dev 04.04.2025
Масштабирование приложений для обработки тысяч и миллионов запросов — обыденная задача для многих команд. Node. js, благодаря своей асинхронной событийно-ориентированной архитектуре, стал популярной. . .
Управление зависимостями в Python с Poetry
py-thonny 04.04.2025
Стандартный инструмент для установки пакетов в Python - pip - прекрасно справляется с базовыми сценариями: установил пакет командой pip install и используешь его. Но что произойдёт, когда разные. . .
Мониторинг с Prometheus в PHP
Jason-Webb 04.04.2025
Prometheus выделяется среди других систем мониторинга своим подходом к сбору и хранению метрик. В отличие от New Relic, который использует агентный подход и отправляет данные во внешнее хранилище,. . .
Пакет Context в Golang: Управление потоками и ресурсами
golander 04.04.2025
Работа с горутинами в Go часто напоминает управление непослушными детьми - они разбегаются кто куда, делают что хотят и не всегда завершаются вовремя. К счастью, в Go 1. 7 появился пакет context,. . .
Контейнеризация React приложений с Docker
Reangularity 03.04.2025
Контейнеризация позволяет упаковать приложение со всеми его зависимостями в автономный контейнер, который можно запустить на любой платформе с установленным Docker. Это существенно упрощает процессы. . .
Свой попап в SwiftUI
mobDevWorks 03.04.2025
SwiftUI, как декларативный фреймворк от Apple, предоставляет множество инструментов для создания пользовательских интерфейсов. В нашем распоряжении есть такие API как alerts, popovers, action sheets. . .
Антипаттерны микросервисной архитектуры
ArchitectMsa 03.04.2025
Хорошо спроектированная микросервисная система может выдержать испытание временем, оставаясь гибкой, масштабируемой и устойчивой к большинству проблем. Такая архитектура обладает высоким уровнем. . .
std::mutex в C++: Советы и примеры использования
bytestream 03.04.2025
std::mutex - это механизм взаимного исключения, который гарантирует, что критический участок кода выполняется только одним потоком в каждый момент времени. Это простое, но могущественное средство. . .
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер