2016-02-05 151 views
-2

这样做:如何检查int输入是大于2147436647还是小于-2147483648?

int nbr; 
if (nbr <= -2147483648 || nbr >= 2147483647) 
    printf("No way !!"); 

不写没门!对于低于下限的值(例如-2147483650),因为输入数字变为正数!

+2

你是如何输入数字的? –

+2

你用什么函数来输入?假设一个32位系统,一个'int'不能保存超出该范围的值。如果您使用其中一个'scanf'函数,则无法检查数字溢出。 –

+0

使用很长的时间,因为它确保它可以保持在该范围之外,请检查它是否超出Integer的极限,然后将其重新用于计算。 –

回答

2

int只会在超过32位int的平台上超出范围[-2147436647 2147483647]。

#include <limits.h> 

int nbr; 
#if INT_MIN < -2147483648 || INT_MAX >= 2147483647 
if (nbr < -2147483648 || nbr > 2147483647) 
    printf("No way !!"); 
#endif 

Pre C99平台可能需要工作来处理-2147483648


要检测一个字符串转换为long将超过其范围,

char buf[100]; 
buf[0] = 0; 
fgets(buf, sizeof buf, stdin); 

errno = 0; 
char *endptr; 
long x = strtol(buf, &endtr, 10); 
if (buf == endptr) puts("No conversion"); 
else if (errno) puts("Out of long range"); 

// If `long` is wider than 32-bit and [-2147483648 2147483647] range still needed 
else if (x < -2147483648 || x > 2147483647) puts("No way !!"); 

else printf("%ld\n", x); 
1

使用long long类型,而不是int。这将(可能)给你一个64位整数,除非你的编译器是旧的。如果您使用scanf,请使用%lld。

+0

最好使用'int64_t',并不是所有的平台做的事情同样的方式 –

+0

@MarkYisri注意,虽然'int64_t'极为普遍实现的 - 和非常有益的,一C99/C11兼容的编译器不需要提供_optional_类型 - 并不是所有的平台支持。 (C11 7.20.1.1 3)。所有符合C99/C11的编译器都提供'long long'。 – chux

0

你不能看到,如果一个int的范围之外,因为它甚至不能保持其范围之外的值。

相关问题