Как проверить, содержит ли переменная int без знака отрицательное число?
У меня есть следующий код:
int main()
{
int i;
unsigned int j;
printf("Type a number: ");
scanf("%d", &i);
j = i;
if (________)
{
printf("Negative!\n");
}
return 0;
}
Что бы я вставил в оператор if, чтобы проверить, содержит ли переменная без знака "j" отрицательное число?
4 ответа
Вы можете сделать это просто:
if((int)j < 0)
{
printf("Negative!\n");
}
Вы можете просто проверить переменную i
как например
if ( i < 0 )
{
//...
}
или вы могли бы написать, например,
if ( j > INT_MAX )
{
//...
}
потому что внутреннее представление неотрицательных значений типа int
совпадает с внутренним представлением одинаковых значений типа unsigned int
, По крайней мере, это будет работать для представления 2 дополнения целых чисел.
И наконец вы можете проверить бит знака.
Это один из способов сделать это:
#include<stdio.h>
/* This is in easier to verify example.
* I have used char to represent integers that fits in one byte.
* char is one byte in my system
* In case of an overflow, the numbers are wrapped around.
* You could check with bigger types as you please.
*/
int main(void)
{
unsigned char x;
char y;
printf("Size of char is %zd\n",sizeof(char));
printf("Enter an integer : ");
scanf("%d",&x);
y=x;
printf("Number is %s when converted to signed\n",\
(y>=0?"positive":"negative"));
return 0;
}
Проверяя то же самое с INT_MIN
или же INT_MAX
требует от вас включить limits.h
заголовочный файл Манипулирование битами, как указал Дэвид, - еще один вариант.
int i;
unsigned int j;
// store a value in i
j = i;
Чтобы проверить, j
содержит отрицательное число:
if (0)
{
printf("Negative!\n");
}
Целое число без знака никогда не может содержать отрицательное значение.
Если значение i
отрицательный, тогда он будет преобразован в некоторое положительное значение, когда вы назначаете его j
, Если вы хотите знать, является ли значение i
отрицательно, вы должны проверить i
не j
,
if (i < 0) {
puts("i is negative");
}
else {
puts("i is not negative");
}
puts("j is not negative");
Обратите внимание, что преобразование значения j
вернуться к int
не надежно Преобразование значения, превышающего INT_MAX
печатать int
выдает результат, определяемый реализацией (или выдает сигнал, определяемый реализацией). Весьма вероятно, что вы вернете исходное значение i
а зачем? Если вы хотите проверить значение i
проверить значение i
,