|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
||||||
Изменить знаковость переменной26.06.2020, 13:54. Показов 6290. Ответов 80
Метки нет (Все метки)
Здравствуйте!
Существует ли возможность в языке Си изменять знаковость переменной? То есть, допустим нужно узнать является ли значение некоторой переменной отрицательным числом, как в следующем примере:
0
|
||||||
| 26.06.2020, 13:54 | |
|
Ответы с готовыми решениями:
80
Изменить имя переменной в зависимости от данных переменной изменить значение переменной
|
|
Вездепух
13212 / 6845 / 1825
Регистрация: 18.10.2014
Сообщений: 17,325
|
||
| 26.06.2020, 23:28 | ||
UINT_MAX и UCHAR_MAX у вас называются "отрицательными" значениями. Это довольно странное использование терминологии.Но то, что вы пока написали, фактически просто пытается определять значение знакового бита в знаковой версии типа. По функциональности и портабельности ваш вариант ничем не отличается от прямой проверки знакового бита, предложенной Mane, а во всех остальных отношениях ваш вариант хуже. Почему тогда вы отвергли вариант от Mane? Вы написали "сама проблема заключается именно в изменении знаковости". И как же ваш вариант помогает вам лучше "изменять знаковость" (и что вообще имеется в виду)?
0
|
||
|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
||||||
| 26.06.2020, 23:45 [ТС] | ||||||
|
0
|
||||||
|
Вездепух
13212 / 6845 / 1825
Регистрация: 18.10.2014
Сообщений: 17,325
|
||||||||
| 26.06.2020, 23:55 | ||||||||
UINT_MAX и UCHAR_MAX. Получаем вывод
"Лично у меня эта проблема сегодня возникла из-за реализации переносимости кода. Когда некий тип, определенный с помощью typedef в стороннем модуле (не моем), в другой архитектуре может быть определен с другим размером (например сменится с unsigned int на unsigned long). А в моем коде идет арифметика с переменной этого типа, но именно как знаковой. Получается код непереносимый. И это только один из множества случаев где подобное возникает. Относительно часто это так же возникает когда задумываешься об оптимизации кода." Каким боком в решении этого вопроса может помочь то, что вы написали, в частности преобразование беззнаковых значений к знаковым того же размера (с потерей значения!) - в упор не ясно. По-прежнему все выглядит как XY проблема: вы задаете вопросы о деталях реализации некоего "решения", в то время как само это "решение" - это никакое не "решение", а заблуждение, которое ничего не решает.
0
|
||||||||
|
12 / 10 / 2
Регистрация: 15.12.2017
Сообщений: 70
|
|
| 27.06.2020, 00:18 | |
|
TheCalligrapher, asbvic, я кажется понял, нужно узнать как проверить состояние старшего бита в любой переменной?
0
|
|
|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
|||||
| 27.06.2020, 00:33 [ТС] | |||||
![]() Нет. Нужно изменять знаковость типа переменных. Добавлено через 3 минуты Добавлено через 3 минуты Добавлено через 1 минуту
0
|
|||||
|
12 / 10 / 2
Регистрация: 15.12.2017
Сообщений: 70
|
|
| 27.06.2020, 00:37 | |
|
Слепой, с глухим.
asbvic, мне интересно вы это придумали, и решили, что так может быть. Или это решено на каком-то ином языке программирования как вам надо, но вы тут просто си изучаете и не знаете как это реализовать в данном стандарте. Если так то приведите исходное решение.
0
|
|
|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
|||||
| 27.06.2020, 00:45 [ТС] | |||||
|
0
|
|||||
|
Вездепух
13212 / 6845 / 1825
Регистрация: 18.10.2014
Сообщений: 17,325
|
||
| 27.06.2020, 00:49 | ||
UCHAR_MAX (положительное) при приведении к типу signed char становится отрицательным. Это - потеря значения.
0
|
||
|
12 / 10 / 2
Регистрация: 15.12.2017
Сообщений: 70
|
|||
| 27.06.2020, 00:52 | |||
|
asbvic,
0
|
|||
|
Вездепух
13212 / 6845 / 1825
Регистрация: 18.10.2014
Сообщений: 17,325
|
||
| 27.06.2020, 00:55 | ||
|
Для того, чтобы более-менее безопасно обрабатывать беззнаковые значения в знаковом контексте, их надо сначала привести к следующему по ширине знаковому типу и выполнять вычисления в рамках этого знакового типа. То есть значения uint8_t должны быть преобразованы к int16_t, uint16_t к int32_t и т.д.Это не стопроцентная гарантия безопасности, но это обязательный шаг в этом направлении. Вот, что вам нужно, согласно вашему описанию задачи. Зачем вы в рамках этой задачи бросились проверять знак каких-то переменных... мне не ясно.
0
|
||
|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
||||
| 27.06.2020, 01:20 [ТС] | ||||
|
Добавлено через 11 минут Иногда во время выполнения каких-либо арифметических действий в переменной не может быть отрицательное число. А по завершению этих действий, результат может быть отрицательным. Можно конечно изначально рассматривать эту переменную как отрицательную, но тогда вы лишаетесь половины ее диапазона во время вычислений. А потом при переносимости вам может потребоваться изменить ее размер. Как быть? Весь код переписывать? Ну это почти все тоже самое что я выше писал. Добавлено через 53 секунды
0
|
||||
|
12 / 10 / 2
Регистрация: 15.12.2017
Сообщений: 70
|
|
| 27.06.2020, 01:24 | |
|
asbvic, есть задача (промежуточная), она возникает при достижение цели (основной задачи)
Цель ремонт фундамента. Задача передвинуть дом на время ремонта. Для легких домов задача решается типовым способом. Для тяжелых домов, требуется индивидуальное разовое решение, его назовем "костыль" или же, что еще вернее будет - изменим задачу, но так что бы цель не страдала. А бывает цель передвинуть дом. Просто я так хочу. Цель ради цели. Разницу видите? Так вот я так понимаю, у вас последний случай. И если это не олимпиадная зада, выкиньте в мусорку это цель. Теория относительноти, вам быстрее в жизни пригодится, чем применение этого решение на практике.
0
|
|
|
Вездепух
13212 / 6845 / 1825
Регистрация: 18.10.2014
Сообщений: 17,325
|
|||
| 27.06.2020, 01:29 | |||
|
После приведения беззнакового значения к знаковому типу дает иной результат при сравнении с 0. Было больше нуля - стало меньше нуля. Это - потеря значения. После приведения беззнакового значения к знаковому типу оно дает иной результат в операциях умножения. Это - потеря значения. После приведения беззнакового значения к знаковому типу оно дает иной результат после integral promotions. Это - потеря значения. Все это приводит к необратимым потерям правильности результата вычислений и поведения программы. Когда в комнате доминируют такие слоны, мне не ясно, какую вообще роль может играть несчастная Моська "сохранения значения при приведении обратно". Ваш же подход неработоспособен в принципе.
0
|
|||
|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
||
| 27.06.2020, 01:31 [ТС] | ||
|
apostata, спасибо за мнение.
Добавлено через 1 минуту
0
|
||
|
12 / 10 / 2
Регистрация: 15.12.2017
Сообщений: 70
|
||
| 27.06.2020, 01:32 | ||
|
asbvic,
вам в раздел assembler, там вам быстро разжуют, что может и думает о вас машина. Это если у вас х86, а если вы думаете как машины, а ваши данные это некие значения из вне (датчики), то где то тут есть ветка и для этого.
0
|
||
|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
|
| 27.06.2020, 01:32 [ТС] | |
|
TheCalligrapher, я думаю бессмысленно продолжать. Я вас услышал. Спасибо. Но для убедительности нужно выслушать еще ни одно мнение. )
0
|
|
|
Вездепух
13212 / 6845 / 1825
Регистрация: 18.10.2014
Сообщений: 17,325
|
||
| 27.06.2020, 01:34 | ||
intmax_t, то вам нужно либо1. Реорганизовать вычисления, чтобы избежать промежуточного переполнения. 2. Если 1 - невозможно, то переходить к длинной арифметике. Но это все, как вы говорите, банальщина. Однако я в упор не вижу, как ваши манипуляции смогут здесь чем-то помочь.
0
|
||
|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
|
| 27.06.2020, 01:35 [ТС] | |
|
apostata, у меня создается впечатления что мы с вами с разных планет. ) Возможно мы просто не можем друг друга понять. Я не вижу смысла продолжать. Спасибо.
0
|
|
|
12 / 10 / 2
Регистрация: 15.12.2017
Сообщений: 70
|
|
| 27.06.2020, 01:44 | |
|
asbvic, вы хотите в один и тот же адрес памяти, ложить одновременно большие положительно числа (больше диапазона знакомого числа), и отрицательные. А компилятор должен догадываться, что вы туда сунули и адекватно на это реагировать?
0
|
|
|
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
|
|
| 27.06.2020, 19:08 [ТС] | |
|
apostata, нет, вы смотрите на данную проблему поферхностно, совсем не стараясь вникнуть. В итоге вы видите какие-то через чур банальные вещи, о которых я не стал бы здесь заводить речь.
Добавлено через 5 минут apostata, TheCalligrapher, специально для вас придумал еще одну формулировку вопроса. Вот вы же в своих программах используете операторы приведения типов? Дак вот то что мне нужно, это и есть примерно то же самое. Только мне нужно при приведении типа менять не весь тип (размер и знаковость), а только его знаковость (размер должен оставаться прежним). Вот так я надеюсь будет максимально понятно. И если вдруг у вас все равно возникает вопрос: "А зачем тебе это надо?" (это отсылка к XY-проблеме), ответьте тогда на вопрос: зачем вы в своих программах используете операторы приведения типов?
0
|
|
| 27.06.2020, 19:08 | |
|
Изменить содержимое переменной
Изменить значение переменной? Изменить значение переменной в функции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
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С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|