, если x
имеет тип unsigned int
, то так же -x
, и это фактически эквивалентно 2<sup>n</sup>-x
(где n
наиболее вероятно 32).Чтобы избежать появления предупреждений и , приведите к int
:
f(-static_cast<int>(n));
Я бы рекомендовал прочитать главу «Выражения» стандарта C ++.Там вы увидите, что в выражении -x
происходит интегральное продвижение на x
, что означает, что почти все превращается в int
, а unsigned int
- нет.
Посмотрите на этот очень интересный пример:
template<class T>
void f(T x)
{
//somehow print type info about x, e.g. cout << typeid(x).name() or something
}
int main()
{
char x;
f(x);
f(+x);
f(-x);
}
отпечатков:
char
int
int
Но char
-> int
является интегральной рекламой, тогда как unsigned int
-> int
это преобразование