реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> warning: signed and unsigned type in conditional expression
fox1
сообщение Jul 27 2010, 07:56
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 3-05-06
Из: Нижний Новгород
Пользователь №: 16 725



Добрый день !

Есть такое выражение:

char * s1;

px->n1 = px->prec < 0 ? strlen(px->s)
: (s1 = (char *)memchr((void *)px->s, '\0',
px->prec)) != 0 ? s1 - px->s : px->prec;

px->s это char *

Ругается

warning: signed and unsigned type in conditional expression

на строку : px->prec)) != 0 ? s1 - px->s : px->prec;

Где ошибка ????
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 27 2010, 17:16
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



попробуйте так:
Код
(xxx != 0U) ? ... : ...;
У Вас в настройках компилятора, видимо, задано трактовать char как unsigned char.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 27 2010, 23:05
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Предупреждение
Цитата
warning: signed and unsigned type in conditional expression

переводится как: "в условном выражении используются как знаковые, так и беззнаковые типы". Я бы на месте топикстартера проверил внимательно типизацию членов структуры и без необходимости не пользовался явным приведением типов к знаковому типу char. Вполне возможен случай, когда при выходе беззнакового за границы CHAR_MAX условие будет неверным. Я бы оставил этот момент на integer promotions, т.е. автоматическое расширение типа char до типа int при проверке условия.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 28 2010, 10:22
Сообщение #4


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(demiurg_spb @ Jul 27 2010, 21:16) *
попробуйте так:
Код
(xxx != 0U) ? ... : ...;
У Вас в настройках компилятора, видимо, задано трактовать char как unsigned char.

А не всё ли равно, знаковое число или нет, при сравнении с нулём? unsure.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 28 2010, 10:34
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Варнинг выдаётся независимо от того ноль там или что-либо иное.
Главное, чтобы левая и правая части условия были одного теста (оба со знаком или оба без знака).
А так для неотрицательных чисел со знаком в дополнительном коде код совпадает с числами без знака.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 28 2010, 10:43
Сообщение #6


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(demiurg_spb @ Jul 28 2010, 14:34) *
Варнинг выдаётся независимо от того ноль там или что-либо иное.
Главное, чтобы левая и правая части условия были одного теста (оба со знаком или оба без знака).

Глупости какие. Это что за компилятор такие предупреждения выдаёт?
Real View 4.01 никаких проблем в таких записях не видит, потому как при сравнении с нулём их там быть не может.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 28 2010, 10:46
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Это не глупости. Всё зависит от уровня выдачи варнинга. Задаётся ключами для ЛЮБОГО нормального компилятора.
gcc warning options:
Код
-Wsign-compare
    Warn when a comparison between signed and unsigned values could produce an incorrect result when the signed value is converted to unsigned. This warning is also enabled by -Wextra; to get the other warnings of -Wextra without this warning, use `-Wextra -Wno-sign-compare'.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 28 2010, 10:55
Сообщение #8


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(demiurg_spb @ Jul 28 2010, 14:46) *
Это не глупости. Это зависит от уровня выдачи варнинга. Задаётся ключами для ЛЮБОГО компилятора.

В настройках стоит All Warnings.
И, тем не менее, компилируя unsigned char != 0 никаких предупреждений не выдаётся.

Вы сами подумайте, зачем в данном случае необходимо предупреждение?
Совершенно нормальная запись.

А вот такое - 0U - выглядит довольно странно. Разве нуль может иметь знак? smile.gif

Цитата
Warn when a comparison between signed and unsigned values could produce an incorrect result

Ну и как при сравнении целого числа (со знаком или без) на равенство нулю можно получить неверный результат?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 28 2010, 11:00
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(sonycman @ Jul 28 2010, 14:55) *
А вот такое - 0U - выглядит довольно странно. Разве нуль может иметь знак? smile.gif
Вы смешиваете тёплое с мягкимsad.gif Не нуль имеет знак, а объек имеет ТИП. А типы у 0 и 0U различны. То что для Вас выглядит странно - не должно означать что этого быть не может, просто Вы ещё не сталкивались.

Цитата
Ну и как при сравнении целого числа (со знаком или без) с нулём можно получить неверный результат?
Перечитайте внимательно цитату из моего предыдущего сообщения.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 28 2010, 11:03
Сообщение #10


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(demiurg_spb @ Jul 28 2010, 15:00) *
Вы смешиваете тёплое с мягкимsad.gif

Угу.
Когда же наконец гнусь станет нормальным компилятором? laughing.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 28 2010, 11:11
Сообщение #11


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Ооо... Прощайте!


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 28 2010, 18:18
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(sonycman @ Jul 28 2010, 14:55) *
В настройках стоит All Warnings.
И, тем не менее, компилируя unsigned char != 0 никаких предупреждений не выдаётся.

Вы сами подумайте, зачем в данном случае необходимо предупреждение?
Совершенно нормальная запись.

А вот такое - 0U - выглядит довольно странно. Разве нуль может иметь знак? smile.gif

Ну и как при сравнении целого числа (со знаком или без) на равенство нулю можно получить неверный результат?

Сравнение с нулем для чисел без знака может не быть корректным в ряде случаев, например x<0, где x - данные без знака (unsigned). В таких случаях компилятор выдает предупреждение. Когда выполняется проверка на == / !=, то все выполняется корректно. То же самое относится и к сравнению чисел со знаком и без оного. Например, условие x <= -1 есть "Истина" (true), если x имеет тип unsigned.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 28 2010, 19:05
Сообщение #13


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(_Bill @ Jul 28 2010, 22:18) *
Сравнение с нулем для чисел без знака может не быть корректным в ряде случаев, например x<0, где x - данные без знака (unsigned).

Конечно. В таком случае компилятор обязательно выдаст предупреждение, а то и ошибку.

Но я то говорю о проверке на равенство нулю.
В этом случае знак не имеет никакого значения. И вменяемый компилятор не будет пудрить мозги глупыми предупреждениями о том, чего не может быть в принципе.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 29 2010, 03:40
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(sonycman @ Jul 28 2010, 23:05) *
Конечно. В таком случае компилятор обязательно выдаст предупреждение, а то и ошибку.

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

Ну, да. Проверка на равенство/неравенство всегда будет выполняться корректно.
Go to the top of the page
 
+Quote Post
fox1
сообщение Jul 29 2010, 07:11
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 3-05-06
Из: Нижний Новгород
Пользователь №: 16 725



Попробовал

px->n1 = px->prec < 0 ? strlen(px->s)
: (s1 = (char *)memchr((void *)px->s, '\0',
px->prec)) != 0U ? s1 - px->s : px->prec;

все равно ругается на

px->prec)) != 0U ? s1 - px->s : px->prec;

похоже вся загвоздка в

s1 - px->s

не нравится вычитание указателей на char

char * s1;
_Pft *px;
typedef struct
{

.......

char *s;

.....

} _Pft;


может привести к какому-нибудь типу ?

Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01516 секунд с 7
ELECTRONIX ©2004-2016