|
Деление int на size_t |
|
|
|
 |
Ответов
|
Nov 6 2013, 22:38
|

Любитель
    
Группа: Свой
Сообщений: 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ов точно также отбрасывает знак и считает, что результат может быть только положительный. Прискорбно
|
|
|
|
|
Nov 7 2013, 03:59
|

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

|
Цитата(sonycman @ Nov 7 2013, 04:38)  А вот GCC в AtmelStudio и для ARMов точно также отбрасывает знак и считает, что результат может быть только положительный. Прискорбно  Это не прискорбно, это - в соответствии со стандартом. Вот что говорится в 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, как беззнаковый.)
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Nov 7 2013, 08:47
|

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

|
Цитата(AHTOXA @ Nov 7 2013, 07:59)  Ваш вариант - последний (поскольку int не может вместить всех значений size_t, size_t - не может вместить всех значений int, то побеждает size_t, как беззнаковый.) Тогда обязан был быть ворнинг или даже еррор, так как в результате такого преобразования разрушается значение Int. Но никакого предупреждения компилер не дает. Вероятно, более продвинутые компиляторы понимают, что в моём случае sizeof() даёт размерность, которая умещается в простом char, и, соответственно, не преобразуют Int. Для GCC это непосильная задача
|
|
|
|
|
Nov 7 2013, 09:30
|

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

|
Цитата(sonycman @ Nov 7 2013, 14:47)  Вероятно, более продвинутые компиляторы понимают, что в моём случае sizeof() даёт размерность, которая умещается в простом char, и, соответственно, не преобразуют Int. Для GCC это непосильная задача  1. sizeof() возвращает size_t, независимо от значения. 2. int/size_t возвращает size_t. (при условии sizeof(int) == sizeof(size_t) ) Это требование стандарта. Вы считаете, что несоблюдение компилятором стандарта языка говорит о том, что этот компилятор "более продвинутый"?  Кстати, есть вариант, что в этих продвинутых компиляторах int просто длиннее, чем size_t, и поэтому всё получается нормально без нарушения стандарта.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Nov 7 2013, 09:37
|

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

|
Цитата(AHTOXA @ Nov 7 2013, 13:30)  1. sizeof() возвращает size_t, независимо от значения. 2. int/size_t возвращает size_t. (при условии sizeof(int) == sizeof(size_t) ) Это требование стандарта. Вы считаете, что несоблюдение компилятором стандарта языка говорит о том, что этот компилятор "более продвинутый"?  Кстати, есть вариант, что в этих продвинутых компиляторах int просто длиннее, чем size_t, и поэтому всё получается нормально без нарушения стандарта. А что, Вы будете спорить, что IAR и прочие коммерческие компилеры - более продвинутые? Это видно и на моём примере  А в защиту GCC можно сказать только - что он "блюдёт" стандарты.
|
|
|
|
|
Nov 7 2013, 12:27
|

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

|
Цитата(AHTOXA @ Nov 7 2013, 15:17)  Вот уж не ожидал, что приведённое мной объяснение может вызвать такую реакцию. Подумайте ещё вот о чём. Существует ненулевая вероятность, что в какой-то из следующих версий IAR данное несоответствие стандарту устранят...  Да обычная реакция. Когда в очередной раз слышишь, что маразм из разряда -2/1=2 - это стандарт. Не только IAR "игнорирует" ваш стандарт, но и CodeVisionAVR. Я еще Keil не проверял, возможно, он тоже из разряда "недоделанных"  Может быть, отличия в результатах компиляции - вовсе не различная трактовка стандартов, а работа оптимизации?
|
|
|
|
|
Nov 7 2013, 16:33
|

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

|
Это не мой стандарт, это стандарт языка Си. И лучше такой стандарт, чем никакого. Странно, что вы, вроде бы достаточно опытный разработчик, этого не понимаете. А уж ссылки на CodeVisionAVR - это вообще нонсенс, поскольку давно известно, что CodeVisionAVR - это компилятор "языка, похожего на Си":) Вы лучше проверьте "взрослые" компиляторы. (И посмотрите в IAR, чему там равны sizeof(int) и sizeof(size_t), вдруг и IAR соблюдает стандарт).
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Nov 7 2013, 21:31
|

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

|
Цитата(AHTOXA @ Nov 7 2013, 20:33)  (И посмотрите в IAR, чему там равны sizeof(int) и sizeof(size_t), вдруг и IAR соблюдает стандарт). Оба равны двум, что неудивительно. Только у одного 2+2 равно 4, а у второго - 5. Думаете, какой из них больше соблюдает стандарт? ЗЫ: сейчас докачаю Кейл и проверю там, на АРМ. ЗЗЫ: Упс, обновил AtmelStudio на последнюю версию 6.1 (стояла 6.0), ничего в тексте не менял, пересобрал проект - появилось знаковое деление и обработка отрицательных значений. То есть исправили багу и теперь поведение GCC стало аналогичным IAR. Попробуйте теперь объяснить, как необходимо правильно трактовать разные умные стандарты Ставить Кейл пока не стану, уверен, что его код будет аналогичен IAR.
|
|
|
|
Сообщений в этой теме
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    zhevak ... и еще вот тут есть интересные рассуждения про ... Nov 7 2013, 06:09           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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|