Почему я получаю предупреждение «преобразование в 'short unsigned int' из 'int' может изменить его значение» при вычитании двух коротких замыканий без знака - PullRequest
0 голосов
/ 13 июля 2020

Я получаю это предупреждение

warning: conversion to ‘short unsigned int’ from ‘int’ may alter its value [-Wconversion]
unsigned short spaceEmpty = 10 - spaceFilled; 

из этих строк кода

unsigned short spaceFilled = num_items(aisle, j);
unsigned short spaceEmpty = 10 - spaceFilled; 

Кто-нибудь знает, почему это происходит? num_items возвращает короткое замыкание без знака, и spaceFilled инициализирован правильно.

Итак, почему выполнение операции arithmeti c в spaceEmpty дает мне предупреждение?

Ответы [ 3 ]

1 голос
/ 13 июля 2020

Выражение 10 - spaceFilled имеет тип int из-за арифметики c преобразований операндов, происходящих перед выполнением арифметики c.

Затем вы назначаете это * От 1007 * до unsigned short, что приводит к предупреждению.

Есть две части, которые влияют на окончательный тип:

  • 10 литерал имеет тип int. Таким образом, операция будет принимать типы как минимум этого размера
  • spaceFilled, будучи меньше int, будет повышена как минимум до int.

Так что даже если вы замените 10 на (unsigned short)10, вы все равно получите повышение операндов до int.

0 голосов
/ 13 июля 2020

10 - целочисленная константа типа int. Если вы выполняете арифметические c операции со значениями разных типов, значение с типом меньшего представления повышается до типа значения с большим представлением.

Примечание: приведение также означает преобразование поэтому, если вы явно приведете одно из значений операнда, правило продвижения по-прежнему применяется.

Например, (unsigned short) 10 + (unsigned short) 10 по-прежнему получает значение типа int.

Итак, в:

10 - spaceFilled;

spaceFilled повышается до int перед вычитанием.

Значение результата int присваивается spaceEmpty типа unsigned short. Здесь происходит преобразование из int в unsigned short.

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

0 голосов
/ 13 июля 2020

Тип данных unsigned short int диапазон существует от 0 до 65 535, тогда как int (4 байта) от -2 147 483 648 до 2 147 483 647.

Таким образом, , если целое число имеет значения больше 65535 или меньше нуля, значения, очевидно, могут измениться и дать предупреждение о преобразовании.

Вы пытаетесь преобразовать что-то большое в очень маленькое. Компилятор не подтверждает, должен ли пользователь ввести ввод в диапазон, и никаких ошибок не произойдет, это зависит от пользователя.

Есть два способа: либо преобразовать любой из них в то же, что и другой или явно приведите тип переменной (например, (unsigned short int) 10).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...