Сдвигает ли подписанный бит подписанного короткого неопределенного поведения в C? - PullRequest
0 голосов
/ 12 декабря 2018

Я слышал, что переход в знаковый бит целого числа, т. Е.

int test = INT_MAX;
test = (test<<1) + 1;

, является неопределенным поведением из-за того, что тест больше INT_MAX.Но будет ли такое поведение встречаться в коротких знаковых переменных, то есть

short test1 = SHRT_MAX;
test1 = (test1<<1) + 1;

?

В настоящий момент я не сталкивался с какой-либо соответствующей документацией.

РЕДАКТИРОВАТЬ: Я знаю, что неопределенное поведение приведет к целым числам, но не к кратким.

1 Ответ

0 голосов
/ 12 декабря 2018

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

. Это дает две возможности:

  1. На платформе, где int имеет тот же размер, что и short, сдвиг будет неопределенным, посколькуон сдвигается в знаковый бит int.(Точнее, причина в том, что результат не может быть представлен как int).См. C11 6.5.7p4 .
  2. На платформе, где int имеет больше битов, чем short, сам сдвиг будет успешным (хотя он может быть неопределенным, если вы меняетеболее чем на 1).Однако, когда вы присваиваете результат обратно в переменную short, значение не сможет быть представлено как short.Фактическое значение, которое будет присвоено, определяется реализацией.См. C11 6.3.1.3p3 .
...