Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164

Изменить знаковость переменной

26.06.2020, 13:54. Показов 6284. Ответов 80
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Существует ли возможность в языке Си изменять знаковость переменной? То есть, допустим нужно узнать является ли значение некоторой переменной отрицательным числом, как в следующем примере:

C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
typedef char Some_type; // Данная строчка может находится в другом модуле и
                        // содержать описание произвольного типа.
Some_type some_var;
 
int main(void)
{
    return some_var < 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.06.2020, 13:54
Ответы с готовыми решениями:

Изменить имя переменной в зависимости от данных переменной
Задача такова: пользователь вводит сроку и нужно создать объект с именем, как в строке. Пробовал сам, но одни ошибки. Подскажите,...

изменить значение переменной
Привет, всем. я пытаюсь написать скрипт Органайзер, перед тем как его открыть надо задать пароль, ник и месяц и год, который кого либо...

изменить значение переменной
Есть file.php, в нем есть переменная $kku = &quot;156666&quot;; Есть страница, smenap.php &lt;form action=\&quot;\form.php&quot;&gt; ...

80
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
27.06.2020, 19:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от asbvic Посмотреть сообщение
уществует ли возможность в языке Си изменять знаковость переменной?
умножить на -1
Цитата Сообщение от asbvic Посмотреть сообщение
То есть, допустим нужно узнать является ли значение некоторой переменной отрицательным числом,
сравнить с 0
Цитата Сообщение от asbvic Посмотреть сообщение
some_var < 0;
Добавлено через 3 минуты
Цитата Сообщение от asbvic Посмотреть сообщение
Только мне нужно при приведении типа менять не весь тип (размер и знаковость)
ты про signed unsigned?
так это и есть приведение
C
1
2
3
int a=-1;
unsigned b=(unsigned)a;
printf("a=%d b=%d",a,b);
0
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
27.06.2020, 20:32  [ТС]
ValeryS, так и хочется написать "еще один" . Шутка конечно же .

Все то что вы пишите до этого уже писали. Но я еще раз повторю чтобы не пришлось все перечитывать.

Цитата Сообщение от ValeryS Посмотреть сообщение
умножить на -1
Не нужно менять знак значения переменной. Нужно изменить знаковость типа этой переменной. Т.е. изменить тип так, чтобы изменилась только знаковость (с unsigned на signed и наоборот), а размер остался прежним.

Цитата Сообщение от ValeryS Посмотреть сообщение
сравнить с 0
Там имелось в виду, что переменная определена с беззнаковым типом, но при сравнении нужно рассматривать ее как знаковую (т.е. произвести то самое изменение знаковости). При этом размер типа этой переменной может оказаться разным (например, сравнение происходит внутри макроса, где на входе могут быть переменные с любым целочисленным типом, или при переносе кода на другие платформы).

Цитата Сообщение от ValeryS Посмотреть сообщение
ты про signed unsigned?
так это и есть приведение
C
1
2
3
int a=-1;
unsigned b=(unsigned)a;
printf("a=%d b=%d",a,b);
Там, где вы написали (unsigned), т.е. произвели приведение типа, вы поменяли как размер типа, так и его знаковость. А мне нужно произвести только изменение знаковости.

Добавлено через 6 минут
ValeryS, точнее в последнем примере размер типа конечно не изменился, потому что он совпал. Но изменится, если переменная будет определена например с типом short.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
27.06.2020, 21:15
Цитата Сообщение от asbvic Посмотреть сообщение
Не нужно менять знак значения переменной. Нужно изменить знаковость типа этой переменной.
расскажи,что такое знаковость
то что ты пытаешься обозвать знаковостью, это изменение типа
Цитата Сообщение от asbvic Посмотреть сообщение
Но изменится, если переменная будет определена например с типом short.
C
1
2
short a=-1;
unsigned short b=(unsigned short)a;
Цитата Сообщение от asbvic Посмотреть сообщение
При этом размер типа этой переменной может оказаться разным (например, сравнение происходит внутри макроса, где на входе могут быть переменные с любым целочисленным типом, или при переносе кода на другие платформы).
ну и как ты себе это представляешь? тип int на 16 битной платформе 16 бит а на 32х битной уже 32 бита
и то и другое int?
тем более макросами(источниками багов) это все оформить
0
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
27.06.2020, 21:44  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
расскажи,что такое знаковость
то что ты пытаешься обозвать знаковостью, это изменение типа
Но я ведь уже все рассказал, и не по одному разу. Может вместо того чтобы мне повторять по нескольку раз, вы просто внимательно все предыдущие сообщения прочитаете?

"Знаковость" - это термин, который мне в рамках данного вопроса пришлось придумать, поскольку по другому я не знаю как это назвать. Знаковость - это характеристика целочисленного типа, которая определяет диапозон числа (на ряду с его размером, т.е. не только знаковость определяет диапозон) и возможность хранить отрицательные числа. Т.е., грубо говоря, это те самые signed и unsigned. Дак вот, мой вопрос в следующем: есть ли возможность в языке изменять (в каких-либо выражениях) тип так, чтобы менялась только эта знаковость, а размер типа оставался прежним? Как еще более понятливее объяснять???

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
C
1
2
short a=-1;
unsigned short b=(unsigned short)a;
Дак вы же оператор заменили. Т.е. получается это уже другой код, что говорит о его непереносимости.

Добавлено через 4 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
ну и как ты себе это представляешь? тип int на 16 битной платформе 16 бит а на 32х битной уже 32 бита
и то и другое int?
Это здесь вообще не при чем. Вы не поняли сути раз такое пишите, к сожалению.

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
тем более макросами(источниками багов) это все оформить
Ну вот, стереотипы посыпались. Источником багов всегда был недопрограммист, а не инструмент, которым он пользуется.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
27.06.2020, 23:23
Цитата Сообщение от asbvic Посмотреть сообщение
"Знаковость" - это термин, который мне в рамках данного вопроса пришлось придумать,
не надо ничего придумывать, есть термин тип (unsigned\signed) и все что ты пытаешься изобразить есть просто приведение типов
Цитата Сообщение от asbvic Посмотреть сообщение
есть ли возможность в языке изменять (в каких-либо выражениях) тип так, чтобы менялась только эта знаковость, а размер типа оставался прежним?
нет
sizeof(unsigned int)==sizeof(signed int)
по твоим желаниям
sizeof(unsigned int)==sizeof(signed int)+1
даже не +1 а +1/8 представим что char 8 бит, что чаще всего и есть, но это не постулат
возможно ли это?
1
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
27.06.2020, 23:59  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
не надо ничего придумывать, есть термин тип (unsigned\signed) и все что ты пытаешься изобразить есть просто приведение типов
Я не против называть это приведением типа. Но только это не обычное приведение типа. Мне нужно чтобы тип менялся не полностью, чтобы менялась только знаковая его составляющая. Это до сих пор не понятно?

Цитата Сообщение от ValeryS Посмотреть сообщение
нет
Первый ответ! Спасибо за ответ. Но только вот я предполагаю что вы до конца меня не поняли, потому что пишите следующее:
Цитата Сообщение от ValeryS Посмотреть сообщение
нет
sizeof(unsigned int)==sizeof(signed int)
по твоим желаниям
sizeof(unsigned int)==sizeof(signed int)+1
даже не +1 а +1/8 представим что char 8 бит, что чаще всего и есть, но это не постулат
Мне это и не нужно. Не в этом мое жаление. Разве я про это где-то писал???
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
28.06.2020, 00:42
Цитата Сообщение от asbvic Посмотреть сообщение
Мне это и не нужно. Не в этом мое жаление.
ну как же не нужно
Цитата Сообщение от asbvic Посмотреть сообщение
Разве я про это где-то писал???
вот же
Цитата Сообщение от asbvic Посмотреть сообщение
есть ли возможность в языке изменять (в каких-либо выражениях) тип так, чтобы менялась только эта знаковость, а размер типа оставался прежним?
например размер unsigned int 32 бита
значит и signed int должен быть 32 бита один бит на знак итого 33 бита
0
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
28.06.2020, 01:26  [ТС]
ValeryS, дак вы же сами себе противоречите. Я же и написал что размер типа должен оставаться прежним. А вы пишите что у вас тип меняет свой размер с 32 бит на 33 бита (что противоречит моему требованию). Я же именно про размер типа пишу.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13212 / 6845 / 1825
Регистрация: 18.10.2014
Сообщений: 17,323
28.06.2020, 05:10
Цитата Сообщение от asbvic Посмотреть сообщение
И если вдруг у вас все равно возникает вопрос: "А зачем тебе это надо?" (это отсылка к XY-проблеме), ответьте тогда на вопрос: зачем вы в своих программах используете операторы приведения типов?
Я уже приводил конкретный пример, зачем. А именно: например, для перехода об беззнакового типа к более широкому знаковому для выполнения знаковых вычислений. Другой пример: перехода об целочисленного типа к более широкому целочисленному для выполнения умножения. И т.п.

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

Цитата Сообщение от asbvic Посмотреть сообщение
Я же и написал что размер типа должен оставаться прежним.
Вот это и вызывает недоумение и отторжение, учитывая, что никакой информации о реальном диапазоне значений вы не предоставили.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
28.06.2020, 08:05
Цитата Сообщение от asbvic Посмотреть сообщение
дак вы же сами себе противоречите.
я противоречу?!
Цитата Сообщение от asbvic Посмотреть сообщение
Я же и написал что размер типа должен оставаться прежним
размер чего в этом типе?
чем тогда не устраивает простое приведение ?
Цитата Сообщение от asbvic Посмотреть сообщение
Я не против называть это приведением типа. Но только это не обычное приведение типа. Мне нужно чтобы тип менялся не полностью, чтобы менялась только знаковая его составляющая.
так давай на пальцах
-1 во что должно превратится?
а 1? а -2?
0
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
28.06.2020, 15:42  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
размер чего в этом типе?
В смысле "чего в типе"??? Сам тип. У типа есть размер.

Цитата Сообщение от ValeryS Посмотреть сообщение
чем тогда не устраивает простое приведение ?
Тем, что сам тип может меняться (причины я уже писал), а точнее его размер.

Цитата Сообщение от ValeryS Посмотреть сообщение
так давай на пальцах
-1 во что должно превратится?
а1? а-2?
Да что вы прицепились к самим числам? Речь не о том чтобы что-то изменять в самой переменной, а том чтобы по разному работать с ней. Да, -1 в итоге может стать UINT_MAX например. Но это только лишь с вашей точки зрения. На самом деле ничего не меняется. Все еще будет зависеть от того какие именно действия будут совершаться над этой переменной и того какие числа вообще могут находиться в ней (например единица так и останется еденицей).

Добавлено через 14 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А вот переход от беззнакового типа к знаковому той же ширины для выполнения знаковых вычислений - это сразу "красный флаг" из-за очевидной опасности переполнения. Такой допустимо только по особой нужде и в тщательно контролируемых ситуациях, т.е. тогда, когда есть уверенность, что диапазон реально используемых значений к переполнению привести не может.
Сначала вы пишите что "красный флаг", а потом пишите что допустимо. Дак допустимо или нет? Я про то и вел речь, что иногда возникают такие ситуации, что гораздо разумнее не увеличивать размер типа, поскольку функционально исключено переполнение. Но все это лишь одна из ситуаций где нужно это (например проверку старшего бита красивее всего проверить с помощью отрицательности).

Добавлено через 7 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вот это и вызывает недоумение и отторжение, учитывая, что никакой информации о реальном диапазоне значений вы не предоставили.
Да забудьте вы про числа, которые там якобы находятся. Может там по задумке программиста находится что-то вроде битового поля.

Добавлено через 5 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Я уже приводил конкретный пример, зачем. А именно: например, для перехода об беззнакового типа к более широкому знаковому для выполнения знаковых вычислений. Другой пример: перехода об целочисленного типа к более широкому целочисленному для выполнения умножения.
И вы хотите сказать что только для этого? Тогда для вас специальный вопрос. Вы хотите сказать, что в ваших программах никогда не происходило такое приведение типа, при котором размер типа не менялся (т.е. signed int -> unsigned int, unsigned short -> signed short, char -> unsigned char / signed char и т.д.)? Вот откройте ваши проекты и поищите подобные места, а потом ответьте.

Добавлено через 18 минут
Цитата Сообщение от asbvic Посмотреть сообщение
Тем, что сам тип может меняться (причины я уже писал), а точнее его размер.
Здесь идет речь про тип переменной, с которым она определена. И в дальнейшем этот тип может быть изменен: либо вами, если вы ее определили, либо другим программистом, если проект сложный. Про это я уже писал.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
28.06.2020, 16:43
Цитата Сообщение от asbvic Посмотреть сообщение
И в дальнейшем этот тип может быть изменен:
не может
он может быть приведен, т.е в данной строчке считать что это другой тип, но от этого сам тип не поменяется
Цитата Сообщение от asbvic Посмотреть сообщение
Да что вы прицепились к самим числам?
да вот понять хотим что требуется
33 бита не устраивает
приведение
Цитата Сообщение от ValeryS Посмотреть сообщение
C
1
2
3
int a=-1;
unsigned b=(unsigned)a;
printf("a=%d b=%d",a,b);
тоже не устраивает
конкретно что нужно? и не своими придуманными терминами а терминами языка

Добавлено через 2 минуты
Цитата Сообщение от asbvic Посмотреть сообщение
В смысле "чего в типе"??? Сам тип. У типа есть размер.
у типа есть размер и у signed и у unsigned он 32 бита
только у signed один бит на знак 31 на число
а у unsigned 32 бита на число
31 не равно 32

Добавлено через 4 минуты
Цитата Сообщение от asbvic Посмотреть сообщение
Тем, что сам тип может меняться (причины я уже писал)
не может! пойми что приведение не меняет тип
int прочитать как массив char это что поменять тип
C
1
2
3
4
5
6
int a=100;
char *b=&a;
printf("%d",b[0]);
printf("%d",b[1]);
printf("%d",b[2]);
printf("%d",b[3]);
0
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
28.06.2020, 16:53  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
не может
он может быть приведен, т.е в данной строчке считать что это другой тип, но от этого сам тип не поменяется
Вы не в теме. Почитайте предыдущие сообщения. Иначе в рамках данного разговора я занимаюсь только тем что повторяю то что уже говорил.

Цитата Сообщение от ValeryS Посмотреть сообщение
у типа есть размер и у signed и у unsigned он 32 бита
только у signed один бит на знак 31 на число
а у unsigned 32 бита на число
31 не равно 32
Я говорил только про размер типа, а не про размер какого-то числа.

Добавлено через 4 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
не может! пойми что приведение не меняет тип
int прочитать как массив char это что поменять тип
Я уже написал что вы не в теме. То про что вы пишите банальные вещи. Я давно уже не новичок. Вы не понимаете о чем идет речь.

Добавлено через 2 минуты
ValeryS, внимательно перечитайте предыдущие сообщения и только потом возвращайтесь к беседе.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
28.06.2020, 17:00
Цитата Сообщение от asbvic Посмотреть сообщение
Вы не в теме.
хорошо объясни, со ссылкой на стандарт, как можно поменять тип переменной
0
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
28.06.2020, 17:00  [ТС]
ValeryS, имелось в виду что тип может поменяться на этапе разработки, а не во время исполнения. Например, проект решили перенести на другую платформу. Я об этом уже писал не один раз.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
28.06.2020, 17:01
Цитата Сообщение от asbvic Посмотреть сообщение
Вы не понимаете о чем идет речь.
вот и жду разъяснений, боюсь не только я один
0
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
28.06.2020, 17:02  [ТС]
ValeryS, вот, только что я вам пояснил. Другие я думаю в курсе, потому что они это уже читали. Вы нет.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
28.06.2020, 17:02
Цитата Сообщение от asbvic Посмотреть сообщение
ValeryS, имелось в виду что тип может поменяться на этапе разработки, а не во время исполнения.
т.е. нужны шаблоны? это в плюсы
0
6 / 6 / 4
Регистрация: 14.01.2016
Сообщений: 164
28.06.2020, 17:04  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
т.е. нужны шаблоны? это в плюсы
Да, может в C++ это можно решить шаблонами. Но мы говорим про язык Си. Т.е. вы поняли о чем речь?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
28.06.2020, 17:11
Цитата Сообщение от asbvic Посмотреть сообщение
Т.е. вы поняли о чем речь?
не знаю правильно или нет
сегодня используем short завтра int а переписывать все лень
могу предложить union

C
1
2
3
4
5
6
7
8
9
10
11
12
typedef union{
signed char ch;
unsigned char uch;
signed short   ss;
unsigned char uss;
signed int  si;
unsigned int usi;
signed long sl;
unsigned long usl;
signed long long sll;
unsigned long long  usll;
} MyType;
на большее ума не хватает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.06.2020, 17:11

Изменить содержимое переменной
Есть переменяя fileWay - это пути к загруженным файлам на сервере разделенные символом &quot;;&quot; тегом перевода строки пример: ...

Изменить букву в переменной
Доброго всем здравия, программа выводит наиболее встречаемую букву в шифротексте, допустим -t-, это зашифрованная буква -e-, английского...

Изменить значение переменной
Помогите пожалуйста. Как сделать так чтобы значение переменной менялось. Переменная num это значение которое отвечает за количество статей...

Изменить значение переменной?
Вот есть у меня страничка index.php там есть вот такой код: PHP код: &lt;?php $file =...

Изменить значение переменной в функции
Возможно ли изменить значение переменной, передаваемой в функцию? Как-то так: void anyfunc(int a1) { //здесь прибавление на...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера 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С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru