Я закончил пятое издание учебника по C ++ и теперь читаю принципы программирования на C ++ и практикуюсь во втором издании Strostrup. Однако автор, похоже, зависит от некоторых UB во многих случаях, таких как этот:

 int x = 2.9;
 char c = 1066;

Здесь x получит значение 2, а не 2.9, потому что x - это int, а int не имеют значений, которые дроби целого числа, просто целые числа (очевидно). Точно так же, если мы используем общий набор символов ASCII, c получит значение 42 (представляющее символ *), а не 1066, потому что в этом наборе символов нет char со значением 1066.

Но char x = 1066; переполняет signed char, поэтому поведение не определено, и я не уверен в том, что он говорит: он производит *, потому что UB может означать что угодно, как я предполагаю, поэтому мы не Результаты не зависят и даже не предполагают. Так что ты думаешь? Спасибо!

0
Itachi Uchiwa 27 Ноя 2021 в 22:10
 – 
Bert
27 Ноя 2021 в 22:24
3
char x = 1066; выполняет сужающее преобразование , прежде чем значение будет присвоено char. Это поведение определяется реализацией (не UB) и не вызывает переполнения char.
 – 
Drew Dormann
27 Ноя 2021 в 22:25
2
Переполнение - это когда результат операции не может быть представлен в типе. Это не переполнение, а сужающее преобразование.
 – 
HolyBlackCat
27 Ноя 2021 в 22:25
Связанные (повторяющиеся?) stackoverflow. ru / questions / 17976878 /…
 – 
OrenIshShalom
27 Ноя 2021 в 22:30
2
Реализация больше не определяется с C ++ 20. Теперь поведение определено в стандарте.
 – 
eerorika
27 Ноя 2021 в 22:36

1 ответ

Лучший ответ

Но char x = 1066; переполняет подписанный символ, поэтому поведение не определено

Это не правда.

Переполнение происходит в результате арифметической операции. Здесь происходит конверсия. Преобразование непредставимого целого числа в другой целочисленный тип не имеет неопределенного поведения, даже если тип подписан.

P.S. char не является signed char. Это разные типы. Его реализация определяет, подписан ли char или нет.

2
eerorika 27 Ноя 2021 в 22:33
Значит, в заданиях UB тоже нет: c = 2048; // assignment? Приведите мне пример того, как это делает UB (арифметика).
 – 
Itachi Uchiwa
27 Ноя 2021 в 22:48
1
Назначение - это не UB, то же самое, что и инициализация. Это UB: INT_MAX + 1
 – 
eerorika
27 Ноя 2021 в 22:49
Ах хорошо! так что char c; c = 5000; тоже не UB, но char c = 127; ++c; UB верно?
 – 
Itachi Uchiwa
27 Ноя 2021 в 22:51
1
Это может быть UB при условии, что 127 == CHAR_MAX
 – 
eerorika
27 Ноя 2021 в 22:53
Хорошо, пойми. Спасибо.
 – 
Itachi Uchiwa
27 Ноя 2021 в 22:56