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

 
 
> Деление 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
AHTOXA
сообщение Nov 7 2013, 03:59
Сообщение #5


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

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



Цитата(sonycman @ Nov 7 2013, 04:38) *
А вот GCC в AtmelStudio и для ARMов точно также отбрасывает знак и считает, что результат может быть только положительный.
Прискорбно sad.gif

Это не прискорбно, это - в соответствии со стандартом.
Вот что говорится в ISO/IEC 9899:1999 6.3.1.8 Usual arithmetic conversions:
Цитата
Otherwise, the integer promotions are performed on both operands. Then the following rules are applied to the promoted operands:
  • If both operands have the same type, then no further conversion is needed.
  • Otherwise, if both operands have signed integer types or both have unsigned integer types, the operand with the type of lesser integer conversion rank is converted to the type of the operand with greater rank.
  • Otherwise, if the operand that has unsigned integer type has rank greater or equal to the rank of the type of the other operand, then the operand with signed integer type is converted to the type of the operand with unsigned integer type.
  • Otherwise, if the type of the operand with signed integer type can represent all of the values of the type of the operand with unsigned integer type, then
    the operand with unsigned integer type is converted to the type of the operand with signed integer type.
  • Otherwise, both operands are converted to the unsigned integer type corresponding to the type of the operand with signed integer type.


Ваш вариант - последний (поскольку int не может вместить всех значений size_t, size_t - не может вместить всех значений int, то побеждает size_t, как беззнаковый.)


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


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



... и еще вот тут есть интересные рассуждения про size_t

http://www.embedded.com/electronics-blogs/...-size-t-matters

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


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
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
|- - 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 Текстовая версия Сейчас: 23rd July 2025 - 22:21
Рейтинг@Mail.ru


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