|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
||||||
Изменить знаковость переменной26.06.2020, 13:54. Показов 6273. Ответов 80
Метки нет (Все метки)
Здравствуйте!
Существует ли возможность в языке Си изменять знаковость переменной? То есть, допустим нужно узнать является ли значение некоторой переменной отрицательным числом, как в следующем примере:
0
|
||||||
| 26.06.2020, 13:54 | |
|
Ответы с готовыми решениями:
80
Изменить имя переменной в зависимости от данных переменной изменить значение переменной
|
|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
|||||||||
| 28.06.2020, 17:42 [ТС] | |||||||||
|
Добавлено через 3 минуты Добавлено через 15 минут Вот тот пример с небольшими исправлениями:
0
|
|||||||||
|
658 / 411 / 76
Регистрация: 21.09.2008
Сообщений: 1,411
|
|
| 29.06.2020, 05:20 | |
|
"Меня терзают смутные сомнения..." (с) Ильф и Петров.
... что автор темы не до конца понимает опасность таких сравнений (знаковых и беззнаковых типов). Я столкнулся с этим давным-давно, когда проверял работу написанной на ассемблере PDP-11 другим разработчиком подпрограммы вывода десятичного числа из внутреннего представления. При пересечении диапазона (в терминах машинного кода - переполнении, когда при сложении двух положительных чисел получается отрицательное число - вот ведь парадокс для неискушенных?) происходил сбой, и вместо правильного числа выводилось неверное представление. Оказалось, что надо было заменить команду перехода при получении отрицательного результата (BMI) на команду перехода при отсутствии переноса (BCC/BHIS), и этот сбой был устранён. Даже метка перехода осталась прежней. Использовался весь диапазон отображения положительных чисел. Современные компиляторы Си/С++ предупреждают о сравнении знаковых и беззнаковых типов. Их разработчики настолько глупые? Вовсе нет. Неужели так сильно хочется набить шишек граблями?
1
|
|
|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
||
| 29.06.2020, 06:13 [ТС] | ||
|
sharpey, спасибо за ваше мнение! Но к сожалению оно тоже не впопад. Я клянусь что это не тот случай, но я не знаю как ясно это доказать. Я думаю что если вы внимательно почитаете последние мои сообщения вы это поймете. Вы опять же как и другие говорите про числа. Повторяю, что в представлении программиста там может быть вообще не число, а значит это уже не тот случай.
0
|
||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
|
|||
| 29.06.2020, 08:12 | |||
|
как все это можно применить на практике?
0
|
|||
|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
|||
| 29.06.2020, 09:49 [ТС] | |||
|
Добавлено через 29 минут Да даже посмотрите на пример из самого вопроса. Из-за того что в одном компиляторе char является знаковым (signed char), а в другом наоборот, результат программы может быть разным. И как быть? Вы конечно же скажите: "Дак поставь оператор приведения типа (signed char)". А если через какое-то время тип Some_type будет переопределен с char на wchar_t. Получается нужно будет переписывать все подобные места. Хотя на самом деле вам просто по смыслу нужно было указать эту самую "знаковость", на трогая размер типа. Например, с помощью этого макроса это и можно сделать (т.е. как бы автоматизировать). Да и дело даже не в том чтобы придумать такой инструмент автоматизации. Просто чисто логически такое должно присутствовать. Но этого нет.
0
|
|||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
|
||||||||||||||||
| 29.06.2020, 11:15 | ||||||||||||||||
char- unsigned char или signed char
Добавлено через 3 минуты приведение к char переменной intэто тоже самое что приведение к signed переменной unsigned
0
|
||||||||||||||||
|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
||||||
| 29.06.2020, 11:25 [ТС] | ||||||
|
Добавлено через 5 минут
0
|
||||||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
|
||||
| 29.06.2020, 11:35 | ||||
|
пока не посмотрю стандарт,может где-то, когда-то и не равны ![]() если этого нет в стандарте значит не кому не нужноДобавлено через 3 минуты ![]() (un)signed short =0xFFFF; или 65535 или -1 что это если не потеря точности? та же что и при приведении int к char
0
|
||||
|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
||||||
| 29.06.2020, 12:15 [ТС] | ||||||
|
Добавлено через 40 секунд Вот как раз при переводе с int в char происходит потеря информации (когда они разных размеров). Добавлено через 1 минуту Надеюсь это шутка.Добавлено через 4 минуты
Ключевые слова: Только сейчас в стандарте увидел термин "signedness" и Google-переводчик перевел его как "знаковость". Проверьте. Добавлено через 13 минут И на Википедии есть целая статья про этот термин: https://en.wikipedia.org/wiki/Signedness
0
|
||||||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
|
|
| 29.06.2020, 12:18 | |
|
0
|
|
|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
|||||||
| 29.06.2020, 14:44 [ТС] | |||||||
|
Добавлено через 2 часа 22 минуты Изменение знаковости при приведении типа (с сохранение размера):
0
|
|||||||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
|
|||
| 29.06.2020, 16:07 | |||
|
вот так и возникают "проблемы 2000" Добавлено через 4 минуты где в реальной программе можно использовать сей макрос?
0
|
|||
|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
||
| 30.06.2020, 06:47 [ТС] | ||
|
Добавлено через 23 минуты ValeryS, вы кстати посмотрели свои исходники Си на наличие приведения типов без изменения размера типа (как я просил)?
0
|
||
|
658 / 411 / 76
Регистрация: 21.09.2008
Сообщений: 1,411
|
||
| 30.06.2020, 07:15 | ||
|
0
|
||
|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
||
| 30.06.2020, 07:39 [ТС] | ||
|
0
|
||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
|
|||
| 30.06.2020, 08:20 | |||
|
только не надо приводить этот листинг с printf, я так и не понял что он делает, кроме того что печатает знаковое или беззнаковое заводить как int возраст или счетчик это недосмотр программиста
0
|
|||
|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
|||
| 30.06.2020, 08:42 [ТС] | |||
|
ValeryS, есть такой реальный случай. В стандартной библиотеке есть функция clock, возвращающая счетчик времени. Результат функции определен как clock_t. Я видел что clock_t на разных системах определяется знаковым типом (например long). Теперь представьте, что вам нужно использовать в выражении результат этой функции как беззнаковый. Вы естественно прибегните к приведению типа - в данном случае (unsigned long). Но согласитесь, что в таком случае ваша программа перестанет корректно работать на системах где size_t определен как int. На самом деле вам же не нужно было менять размер типа, вы просто хотели изменить его знаковость. Но на деле вы изменили оба этих свойства. А с помощью этого макроса (или подобных ему решений) есть возможность преобразовать только знаковость, тем самым увеличить переносимость (автоматизировать процесс переписывания кода).
Добавлено через 12 минут
0
|
|||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
|
|||
| 30.06.2020, 08:46 | |||
|
asbvic, противоречий не видишь
тип clock_t мы рассуждаем о нем
0
|
|||
|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
|
| 30.06.2020, 08:51 [ТС] | |
|
ValeryS, ой, я извиняюсь. Конечно же под size_t я имел в виду clock_t. Теперь противоречия нет?
0
|
|
|
658 / 411 / 76
Регистрация: 21.09.2008
Сообщений: 1,411
|
|
| 30.06.2020, 09:22 | |
|
Для сравнения определений типа clock_t глянул в заголовочные файлы FreeBSD (__int32_t), MinGW-9.2 (long), AVR-GCC 10.2 (unsigned long). Размерности соответствуют, а тип нет, ибо clock() должна возвращать -1 в случае ошибки.
1
|
|
| 30.06.2020, 09:22 | |
|
Изменить содержимое переменной
Изменить значение переменной? Изменить значение переменной в функции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|