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

 
 
> Деление int на size_t
sonycman
сообщение Nov 6 2013, 10:37
Сообщение #1


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

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



Возникла непонятка.
Использую деление переменной типа int на значение, возвращаемое функцией sizeof():

int t;
...
t = t / sizeof(buf);
if (t < 0) ...
else ...

Так вот - знак t может быть различный, но после деления на sizeof() компилятор считает, что знак результата становится положительный и отбрасывает ветку кода для обработки отрицательного значения. Даже функция деления используется беззнаковая.
Если вместо sizeof() подставить константу, то всё начинает работать как положено.

Что я делаю не так, подскажите?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sonycman
сообщение Nov 6 2013, 15:11
Сообщение #2


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

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



Программа и так компилируется в плюсах, какого-то специального варнинга не видел.
Если вместо sizeof() использовать const unsigned char size = 20, то проблем со знаком нет, результат получается со знаком.
Не глюк ли это компилятора? Как еще это можно обьяснить?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 6 2013, 16:59
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sonycman @ Nov 6 2013, 21:11) *
Программа и так компилируется в плюсах, какого-то специального варнинга не видел.

Если там gcc, то за это предупреждение отвечает флаг -Wsign-compare.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 6 2013, 22:38
Сообщение #4


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

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



Цитата(V_G @ Nov 6 2013, 18:00) *
Если перейдете на С++ (язык с более строгим контролем соответствия типов данных) , то компилятор по-хорошему должен выдать сообщение об ошибке и потребовать явного приведения к типу. Всякого рода умолчания тут вредны.

Это именно C++.
А в чём именно ошибка? Int делим на Short (или любой другой тип без знака). В результате будет Int. Это ошибка?

Цитата(zhevak @ Nov 6 2013, 20:47) *
И надо учитывать, что sizeof возвращает не unsigned char, и даже не unsigned int, а size_t.

Функция у sizeof() - вернуть константу, то есть самое обычное число без знака. Каким образом её результат может влиять на знак выражения типа: -100/х = y?

Цитата(AHTOXA @ Nov 6 2013, 20:59) *
Если там gcc, то за это предупреждение отвечает флаг -Wsign-compare.

Проверил на других компиляторах: IAR и CodeVision не страдают этой ошибкой и генерят код в соответствии с математическими правилами и моими ожиданиями.
А вот GCC в AtmelStudio и для ARMов точно также отбрасывает знак и считает, что результат может быть только положительный.
Прискорбно sad.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sonycman   Деление int на size_t   Nov 6 2013, 10:37
- - Xenia   Цитата(sonycman @ Nov 6 2013, 14:37) int ...   Nov 6 2013, 11:24
|- - sonycman   Цитата(Xenia @ Nov 6 2013, 15:24) Результ...   Nov 6 2013, 13:25
||- - defunct   Цитата(sonycman @ Nov 6 2013, 15:25) Но р...   Dec 24 2013, 17:18
|- - mdmitry   Цитата(Xenia @ Nov 6 2013, 15:24) Результ...   Nov 6 2013, 14:20
|- - Xenia   Цитата(mdmitry @ Nov 6 2013, 18:20) А не ...   Nov 6 2013, 16:43
- - V_G   Если перейдете на С++ (язык с более строгим контро...   Nov 6 2013, 14:00
|- - zhevak   Цитата(sonycman @ Nov 6 2013, 21:11) Прог...   Nov 6 2013, 16:47
|- - V_G   Цитата(sonycman @ Nov 7 2013, 08:38) Это ...   Nov 7 2013, 00:44
|- - AHTOXA   Цитата(sonycman @ Nov 7 2013, 04:38) А во...   Nov 7 2013, 03:59
|- - zhevak   ... и еще вот тут есть интересные рассуждения про ...   Nov 7 2013, 06:09
|- - sonycman   Цитата(AHTOXA @ Nov 7 2013, 07:59) Ваш ва...   Nov 7 2013, 08:47
|- - AHTOXA   Цитата(sonycman @ Nov 7 2013, 14:47) Веро...   Nov 7 2013, 09:30
|- - sonycman   Цитата(AHTOXA @ Nov 7 2013, 13:30) 1. siz...   Nov 7 2013, 09:37
|- - AHTOXA   Вот уж не ожидал, что приведённое мной объяснение ...   Nov 7 2013, 11:17
|- - sonycman   Цитата(AHTOXA @ Nov 7 2013, 15:17) Вот уж...   Nov 7 2013, 12:27
|- - AHTOXA   Это не мой стандарт, это стандарт языка Си. И лучш...   Nov 7 2013, 16:33
|- - sonycman   Цитата(AHTOXA @ Nov 7 2013, 20:33) (И пос...   Nov 7 2013, 21:31
|- - AHTOXA   Цитата(sonycman @ Nov 8 2013, 03:31) Оба ...   Nov 8 2013, 04:17
- - sonycman   Прошу прощения, поторопился я вчера с выводами, по...   Nov 8 2013, 10:19
|- - zhevak   Да. Было бы любопытно посмотреть на распечатку асс...   Nov 8 2013, 11:29
|- - sonycman   Цитата(zhevak @ Nov 8 2013, 15:29) Да. Бы...   Nov 8 2013, 12:02
|- - zhevak   Цитата(sonycman @ Nov 8 2013, 18:02) Вы п...   Nov 8 2013, 13:39
- - sonycman   Без проблем, только я сейчас на работе, и смогу до...   Nov 8 2013, 14:13
- - ILYAUL   Коллеги , а давайте в отдельной теме. Эта всё таки...   Nov 8 2013, 14:13
|- - IgorKossak   Цитата(ILYAUL @ Nov 8 2013, 16:13) Коллег...   Nov 8 2013, 18:33
- - sonycman   Несколько устав уже от нюансов по поводу интерпрет...   Nov 9 2013, 19:56
|- - maksimp   Цитата(sonycman @ Nov 9 2013, 22:56) При ...   Nov 28 2013, 20:35
- - Genadi Zawidowski   Ну написано же в стандарте явно про беззнаковость ...   Jan 5 2014, 00:20


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

 


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


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