Перейти к содержанию
    

Приведение типов в Си

2 минуты назад, sasamy сказал:

в С11 изменили 6.5 Expressions ... в С99 нет ничего про UB в 6.5 Expressions

Изменили, потому что так стало понятнее. А суть от этого не поменялась.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/18/2023 at 11:20 PM, Arlleex said:

Изменили, потому что так стало понятнее. А суть от этого не поменялась.

было unspecified behavior стало undefined behavior, почему компиляторы не выдают варнинги после изменения стандарта непонятно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 минут назад, sasamy сказал:

было unspecified behavior стало undefined behavior, почему компиляторы не выдают варнинги после изменения стандарта непонятно

Почему оно было unspecified? Я же привел выдежки из C99 и C11 - там один и тот же пункт  по-разному описан:

6.5 Expressions

было (C99)

Цитата

2 Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression.72) Furthermore, the prior value shall be read only to determine the value to be stored.73)

стало (C11)

Цитата

2 If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side effect occurs in any of the orderings.84)


J.2 Undefined behavior

было (C99)

Цитата

— Between two sequence points, an object is modified more than once, or is modified and the prior value is read other than to determine the value to be stored (6.5).

стало (C11)

Цитата

— A side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object (6.5).

причем точь-в-точь вместо одних и тех же пунктов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/18/2023 at 11:59 PM, Arlleex said:

Почему оно было unspecified?

почему вы у меня спрашиваете ? факт что компиляторы не реагируют на volatile,  и не только компиляторы

https://godbolt.org/z/sc6Yn4Mr7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, sasamy сказал:

почему вы у меня спрашиваете ? факт что компиляторы не реагируют на volatile,  и не только компиляторы

И что? Это показатель того, что код будет корректный и без неопределенного поведения? Выше пример

union {
  int i0;
  int volatile i1;
};

тоже анализатор проглотит без проблем, надо полагать? А в нем неопределенное поведение.

Разговор шел только о том, что отсутствие warnings - это совершенно не показатель отсутствия багов в коде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/19/2023 at 9:33 AM, Arlleex said:

А в нем неопределенное поведение.

Разговор шел только о том, что отсутствие warnings - это совершенно не показатель отсутствия багов в коде.

ещё раз - наличие варнинга и UB это не ошибка в С, что бы ни говорил IAR, MISRA или ООН.

https://godbolt.org/z/zWqaPn3se

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, sasamy сказал:

ещё раз - наличие варнинга и UB это не ошибка в С, что бы ни говорил IAR, MISRA или ООН.

Я поражаюсь вашим способностям отрицать очевидное, но вы и дальше продолжайте верить, что код, содержащий UB - это код, не содержащий ошибок.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/19/2023 at 9:48 AM, Arlleex said:

но вы и дальше продолжайте верить, что код, содержащий UB - это код, не содержащий ошибок.

ещё раз - не считаю нужным оправдываться за ваши фантазии, для тех кому не нужны UB в языке спроектировали Rust., а вы дальше можете верить что пишете на C без ошибок - варнингов нет!

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/15/2023 at 6:04 PM, kan35 said:

Всем большое спасибо за ответы! Мне в общем как бы всё понятно, в общем то и с самого начала было ясно, просто не понимаю почему GCC ARM делает

unsigned short y = x; // y=0x0088

а старый компилятор ANSI'89

unsigned short y = x; // y=0xFF88

 


Здравствуйте, kan35.  Выше все чудесно написали, но мне показалось что до конца именно вашу странность не объяснили.
Я думаю что ваша странность объясняется так.
Скорее всего, вы конвертировали в short не из явного signed char, а из char. Во многих компиляторах существует опция знака char по умолчанию, знаковый или беззнаковый. Либо у вас была другая целевая машина, потому что знак char может еще зависеть от целевой платформы. В итоге у вас был в одном случае по умолчанию unsigned char, а в другом случае signed char. Вот и получались разные результаты.

 

В вопросе знака char до определенной даты имелись расхождения. Так, старый K&R (по книжке) char беззнаковый,  первые стандарты в этом вопросе ничего не  утверждали, стандарт 99 сообщает же только:

Quote

The implementation shall define char to have the same range, representation, and behavior as either signed char or unsigned char.


Для GCC знак задается -funsigned-char или -fsigned-char  
для MSVC (cl.exe) опция /J делает char unsigned.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...