这样做:如何检查int输入是大于2147436647还是小于-2147483648?
int nbr;
if (nbr <= -2147483648 || nbr >= 2147483647)
printf("No way !!");
不写没门!对于低于下限的值(例如-2147483650),因为输入数字变为正数!
这样做:如何检查int输入是大于2147436647还是小于-2147483648?
int nbr;
if (nbr <= -2147483648 || nbr >= 2147483647)
printf("No way !!");
不写没门!对于低于下限的值(例如-2147483650),因为输入数字变为正数!
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);
使用long long
类型,而不是int
。这将(可能)给你一个64位整数,除非你的编译器是旧的。如果您使用scanf
,请使用%lld。
最好使用'int64_t',并不是所有的平台做的事情同样的方式 –
@MarkYisri注意,虽然'int64_t'极为普遍实现的 - 和非常有益的,一C99/C11兼容的编译器不需要提供_optional_类型 - 并不是所有的平台支持。 (C11 7.20.1.1 3)。所有符合C99/C11的编译器都提供'long long'。 – chux
你不能看到,如果一个int的范围之外,因为它甚至不能保持其范围之外的值。
你是如何输入数字的? –
你用什么函数来输入?假设一个32位系统,一个'int'不能保存超出该范围的值。如果您使用其中一个'scanf'函数,则无法检查数字溢出。 –
使用很长的时间,因为它确保它可以保持在该范围之外,请检查它是否超出Integer的极限,然后将其重新用于计算。 –