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

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

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

Студворк — интернет-сервис помощи студентам
почему отрицательное значение 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
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,355
25.09.2022, 11:31
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Verevkin Посмотреть сообщение
Оно жэж и так больше.
Еще раз:

Например

C
1
2
  long long a = -110;
  unsigned long long b = 18446744073709551415u;
Язык С говорит, что (a < b) равно 0.

Что скажет ваш Паскаль? Пробуем:

Pascal
1
2
3
4
5
6
program Hello;
var a : int64 = -110;
    b : uint64 = 18446744073709551415;
begin
  writeln(a < b);
end.
Получаем тоже

Code
1
FALSE
Пробуем C++ с его std::cmp_less

C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <utility>
 
int main()
{
  long long a = -110;
  unsigned long long b = 18446744073709551415u;
  std::cout << std::cmp_less(a, b) << std::endl;
}
Получаем

Code
1
1
То есть std::cmp_less умудряется корректно обработать эту ситуацию.
0
Злостный нарушитель
 Аватар для Verevkin
10889 / 5825 / 1288
Регистрация: 12.03.2015
Сообщений: 26,888
25.09.2022, 11:48
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Еще раз:
Например
Короче, ну нахрен всё это, голова уже болит.
Будем считать, что тот, кто пытается сравнивать знаковое с беззнаковым, тот ССЗБ.
0
фрилансер
 Аватар для Алексей1153
6502 / 5740 / 1134
Регистрация: 11.10.2019
Сообщений: 15,382
25.09.2022, 14:24
Цитата Сообщение от Verevkin Посмотреть сообщение
голова уже болит
чтоб сохранить голову, делай приведение вручную, чтобы не гадать или помнить, как поступит мсье компилятор
0
Злостный нарушитель
 Аватар для Verevkin
10889 / 5825 / 1288
Регистрация: 12.03.2015
Сообщений: 26,888
25.09.2022, 14:26
Цитата Сообщение от Алексей1153 Посмотреть сообщение
чтоб сохранить голову, делай приведение вручную, чтобы не гадать или помнить, как поступит мсье компилятор
чтоб сохранить голову, я работаю на delphi. Он меня честно предупреждает, если я где-то лажаю.
0
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,857
Записей в блоге: 15
25.09.2022, 16:41
Цитата Сообщение от Verevkin Посмотреть сообщение
Он меня честно предупреждает, если я где-то лажаю.
Так и тут предупреждает, прямо конкретно тыча носом )))
0
Злостный нарушитель
 Аватар для Verevkin
10889 / 5825 / 1288
Регистрация: 12.03.2015
Сообщений: 26,888
25.09.2022, 16:54
Цитата Сообщение от мама Стифлера Посмотреть сообщение
Так и тут предупреждает, прямо конкретно тыча носом )))
Не вижу. Хде?

0
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,857
Записей в блоге: 15
25.09.2022, 17:31
0
Злостный нарушитель
 Аватар для Verevkin
10889 / 5825 / 1288
Регистрация: 12.03.2015
Сообщений: 26,888
25.09.2022, 17:36
мама Стифлера, а, так это не по умолчанию.
0
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,857
Записей в блоге: 15
25.09.2022, 17:54
Verevkin, ну по умолчанию, флаги для компилятора не стоят, или стоят по дефолту какие то. В локальном компиляторе(IDE), ты устанавливаешь нужные тебе флаги и все. Короче настроил как тебе надо один раз и забыл. Как то так.
0
Злостный нарушитель
 Аватар для Verevkin
10889 / 5825 / 1288
Регистрация: 12.03.2015
Сообщений: 26,888
25.09.2022, 17:56
Цитата Сообщение от мама Стифлера Посмотреть сообщение
Verevkin, ну по умолчанию, флаги для компилятора не стоят, или стоят по дефолту какие то. В локальном компиляторе(IDE), ты устанавливаешь нужные тебе флаги и все. Короче настроил как тебе надо один раз и забыл. Как то так.
0
0 / 0 / 0
Регистрация: 25.09.2022
Сообщений: 25
25.09.2022, 18:49
TheCalligrapher, Я хотел объяснить как получилось, что отрицательное число при сравнении могло превратится в другое число, которое больше, и это не просто "ошибка сравнения" или Неопределённое Поведение(в конкретном компиляторе), а предсказуемое аппаратно-зависимое и уже стандартное представление чисел. А так да, в идеальном мире идей, спецификации важней, но такое поведение это скорее наследство аппаратных особенностей реализации ставнения и представления чисел в компьютерах, а спецификации просто описывая подобное поведение сохраняют предсказуемость уже написанных компиляторов и правильность уже написанных программ для них

Я бы просто советовал знать компилятор на котором пишешь, чем надеятся, что спецификации всегда помогут(часто помогают, но если что–то реализовано нелогично, то все равно приходится писать алтернативными методами(ну или менять компилятор, но идеальных может и не быть))

//Советую сравнивать только числа в переменных одинакового типа иначе выполнять явное приведение типа — так большинству программистов, я надеюсь, будет проще читать код.
0
Злостный нарушитель
 Аватар для Verevkin
10889 / 5825 / 1288
Регистрация: 12.03.2015
Сообщений: 26,888
25.09.2022, 18:52
Вы маньяки-чикатилы.
Прекратите немедленно!

0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,355
25.09.2022, 20:08
Цитата Сообщение от proger0x8654 Посмотреть сообщение
Я хотел объяснить как получилось, что отрицательное число при сравнении могло превратится в другое число, которое больше, и это не просто "ошибка сравнения" или Неопределённое Поведение(в конкретном компиляторе), а предсказуемое аппаратно-зависимое и уже стандартное представление чисел.
Ну, во-первых, неопределенного поведения тут нет. Если бы тут было неопределенное поведение, то говорить было бы не о чем: никакое аппаратные особенности или представления чисел тут бы ситуацию не спасли.

Цитата Сообщение от proger0x8654 Посмотреть сообщение
но такое поведение это скорее наследство аппаратных особенностей реализации ставнения и представления чисел в компьютерах, а спецификации просто описывая подобное поведение сохраняют предсказуемость уже написанных компиляторов и правильность уже написанных программ для них
В том то и дело, что нет. Нет тут никакого однозначного способа сравнения "в компьютерах". В аппаратуре, как правило, вообще нет возможности выполнять смешанные сравнения, т.е. сравнения знакового и беззнакового числа.

В данном примере мы имеем дело с дилеммой, с которой сталкивается именно компилятор. И вариантов выхода из этой ситуации тут множество (я вижу навскидку как минимум четыре варианта). Никакого однозначного или просто предпочтительного варианта тут "компьютер" не предлагает. Выбор способа сравнения в таких ситуациях целиком и полностью лежит исключительно на компиляторе, т.е. именно на спецификации.

Ссылку на историю обсуждения этого вопроса в С я уже давал.

Цитата Сообщение от proger0x8654 Посмотреть сообщение
Я бы просто советовал знать компилятор на котором пишешь
???
0
фрилансер
 Аватар для Алексей1153
6502 / 5740 / 1134
Регистрация: 11.10.2019
Сообщений: 15,382
25.09.2022, 20:21
Verevkin, вроде обычная для раздела C++ размеренная беседа
0
0 / 0 / 0
Регистрация: 25.09.2022
Сообщений: 25
26.09.2022, 14:27
TheCalligrapher,
Я бы просто советовал знать компилятор на котором пишешь
???
Я о том, что может попасться самописный компилятор, который решил, что он сделает сравнение "по математической логике", а не по спецификации, и в этом случае хорошо бы знать компилятор(лучше исходники понимать) и что у него ещё не реализовано по спецификации, а что "дополнительно реализованные особенности компилятора".
Вот http://programming-lang.com/ru... /j229.html тут пример того, что иногда компилятор думает больше, чем просто трансляция программы самым однозначным способом.
Да, решение такое: при сравнении разных типов писать их явное приведение, потому что правильно решить к какому из типов операндов делать приведение в общем случае не возможно решить.
Многие могут сказать что использование машинно-зависимых типов уменьшает переносимость кода(если почему-то 1 машинное слово == 9 битам), но вот на конкретной машине я думаю что писать просто int, long int, long long int, которые могут быть равны или не равны определённым машинным областям памяти или не меньше какой–то области памяти, а ещё long int может быть равен long long int если 32-битная машина ну это сложнее всё просчитать, чем писать uint8_t, uint16_t, uint32_t, uint64_t и int8_t, int16_t, int32_t, int64_t и float32_t, float64_t и программными float8_t, float16_t, fixed8_t, fixed16_t, fixed32_t, fixed64_t. Про то что int короче писать могу сказать, что сам пользуюсь define'ами u8,u16,u32,u64 и s8,s16,s32,s64 и fl8,fl16,fl32,fl64 и fx8,fx16,fx32,fx64 и мне стало удобнее и проще писать.

//Совет про то, что: не нравятся спецификации стандарта, не пиши на языке C или если компилятор языка C не исполняет спецификации языка C значит он не компилятор языка C пропадают когда вот TCC(Tiny C Compilier) может использовать точку входа как функцию _start() и не грузить из msvcrt.dll ещё набор встраиваемых при компиляции функций, а GCC(GNU C Compilier) пишет на _start() ошибку компиляции. Да и всё равно язык C это естественное развитие макросов ассемблера таких как invoke, поэтому моё мнение что самый низкоуровневый высокоуровневый язык программирования будет C–подобным.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Выбор способа сравнения в таких ситуациях целиком и полностью лежит исключительно на компиляторе, т.е. именно на спецификации.
В идеальном мире идей (реализация компилятора == реализации спецификации), но в реальности это чаще почти так, а то и немного почти так... а так, да, согласен с
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В том то и дело, что нет. Нет тут никакого однозначного способа сравнения "в компьютерах". В аппаратуре, как правило, вообще нет возможности выполнять смешанные сравнения, т.е. сравнения знакового и беззнакового числа.
, это так, я неточно написал, я хотел сказать, что язык C живёт на использовании кодов команд, которые реализованы аппаратно, а потому получилось, что отрицательное число записывается в [дополнительном коде].
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,355
26.09.2022, 17:48
Цитата Сообщение от proger0x8654 Посмотреть сообщение
Я о том, что может попасться самописный компилятор, который решил, что он сделает сравнение "по математической логике", а не по спецификации, а не по спецификации, и в этом случае хорошо бы знать компилятор(лучше исходники понимать) и что у него ещё не реализовано по спецификации, а что "дополнительно реализованные особенности компилятора".
Не бывает.

Никакой С компилятор не станет реализовывать особенности, которые противоречат спецификации языка. Любая свобода реализации "особенностей" для корректного кода располагается в рамках разрешенных стандартом языка неопределенных, неспецифицированных или определяемых реализацией поведений. Выход за эти рамки - баги компилятора, которые будут исправляться с максимально возможной скоростью.

Цитата Сообщение от proger0x8654 Посмотреть сообщение
Вот http://programming-lang.com/ru... /j229.html тут пример того, что иногда компилятор думает больше, чем просто трансляция программы самым однозначным способом.
Этот пример не имеет никакого отношения к языку С.

Цитата Сообщение от proger0x8654 Посмотреть сообщение
//Совет про то, что: не нравятся спецификации стандарта, не пиши на языке C или если компилятор языка C не исполняет спецификации языка C значит он не компилятор языка C пропадают когда вот TCC(Tiny C Compilier) может использовать точку входа как функцию _start() и не грузить из msvcrt.dll ещё набор встраиваемых при компиляции функций, а GCC(GNU C Compilier) пишет на _start() ошибку компиляции.
Пример совершенно мимо кассы. _start - зарезервированный идентификатор.

Цитата Сообщение от proger0x8654 Посмотреть сообщение
В идеальном мире идей (реализация компилятора == реализации спецификации), но в реальности это чаще почти так, а то и немного почти так... а так, да, согласен с
См. выше.
0
0 / 0 / 0
Регистрация: 25.09.2022
Сообщений: 25
01.10.2022, 04:38
TheCalligrapher,
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Не бывает.
Никакой С компилятор не станет реализовывать особенности, которые противоречат спецификации языка.
А если он самописный и скачанный от куда–то из интернета?
Я просто не могу поверить в то, что все в мире, кто писал C–подобный компилятор будут желать реализовать все спецификации точно.
Да и
Примечательным примером является язык Си, который приобрёл популярность без формальной спецификации, а был описан вместо этого в части книги, «Язык программирования Си» (1978 г.), и был формально стандартизован намного позже в ANSI C (1989 г.);
из https://ru.wikipedia.org/wiki/... ммирования, а потому он мог быть написан раньше ANSI C.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
_start - зарезервированный идентификатор.
ну, зарезервировать(ну то есть где–то в include <???????.h> объявить) и я могу 50 разных переменных и прототипов функций с разными префиксами и простыми названиями, только вот если в TCC это можно использовать то в GCC у меня не получилось(ошибка), я был бы рад, если GCC это зарезервированное слово делало мне пользу также как TCC.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Этот пример не имеет никакого отношения к языку С.
Да, признаю, это просто пример разных решений вопроса приведения типа в разных компиляторах.

Добавлено через 2 минуты
Цитата Сообщение от proger0x8654 Посмотреть сообщение
только вот если в TCC это можно использовать то в GCC у меня не получилось(ошибка), я был бы рад, если GCC это зарезервированное слово делало мне пользу также как TCC.
— это я про _start() {}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,355
01.10.2022, 05:15
Цитата Сообщение от proger0x8654 Посмотреть сообщение
TheCalligrapher,
А если он самописный и скачанный от куда–то из интернета?
Вопрос содержит в себе примерно столько же смысла как и "А если он компилятор Паскаля?"

Если компилятор намеренно не соответствует спецификации языка С, то никто, никогда и нигде не будет называть его компилятором языка С.

Цитата Сообщение от proger0x8654 Посмотреть сообщение
Я просто не могу поверить в то, что все в мире, кто писал C–подобный компилятор будут желать реализовать все спецификации точно.
Я не знаю, что в данном случае имеется в виду под "точно". Но:

Если компилятор намеренно не соответствует спецификации языка С, то никто, никогда и нигде не будет называть его компилятором языка С.
0
0 / 0 / 0
Регистрация: 25.09.2022
Сообщений: 25
01.10.2022, 06:50
TheCalligrapher, как я уже писал язык C до некоторого времяни не был стандартизован(а может я старой школы и пишу на древнем компиляторе языка C, который не поддерживает ANSI C), ну а то насколько код программы C–шный можно долго думать(а если там > 50%
C
1
asm volatile(".../*какие–то hack'и c регистрами и битами в них*/...");
)
Да, частично согласен, что
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Если компилятор намеренно не соответствует спецификации языка С, то никто, никогда и нигде не будет называть его компилятором языка С.
, но если он(компилятор) старых времён(до стандартизации) то говорить, что это уже "НЕ язык C", тоже я думаю грубо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.10.2022, 06:50

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru