Существует множество операций, которые осуществляют автоматическое преобразование типов, в том числе назначение, арифметические операции при определенных условиях и вызовы функций (преобразование определенных значений аргументов).
Таким образом, можно достичь конверсии (signed
) int
аргументов unsigned int
просто объявив, что будет типом параметра:
int isNegative(unsigned x) {
return x >> 31;
}
Правда, однако, что функция интерфейс может быть немного запутанным. Таким образом, вы можете предпочесть, чтобы сделать это:
int isNegative(int x) {
unsigned ux = x;
return x >> 31;
}
Однако, я не думаю, что любой из тех, кто так же ясно, как ваша версия, с его броском.Преобразование типов - это целая цель приведения, и когда преобразование - это то, что вам нужно (и все, что вам нужно), бросок - это правильный инструмент для задания.
Конечно, я предпочитаю еще более простое семейство подходов, предложенное @chux.
Непонятно, почему код не просто «возвращает x <0», так как он соответствует цели более высокого уровня «возвращает 1, если x <0 и 0 в противном случае». Конечно, это не отвечает нижним целям, которые я считаю немного неясными. – chux
Если вы хотите, чтобы ваша функция взяла 32-битный тип данных, это «длинный», а не int. – Fredrik
Зачем вам нужно конвертировать без кастинга? Это то, что отличает * для *. –