【发布时间】:2016-07-01 06:43:38
【问题描述】:
#include<stdio.h>
void main()
{
unsigned int a;
printf("Enter a number:");
scanf("%u",&a);
if ( a <= 4294967295) {
printf("Entered no is within limit\n");
}
else {
printf("Entered no is not in the limit");
}
}
哪个输入数字会在上述条件下执行else块?
if 块总是被执行,尽管输入大于限制。这是因为包装。有什么方法可以查出包裹吗?
这是因为 unsigned int 的最大限制是 4294967295,它是二进制 1 的 32 位 如果我的输入是 4294967296,它将变为 1,后跟 32 位 0。 我们无法访问 1 的第 33 位 是否有可能访问第 33 位?
【问题讨论】:
-
鉴于您有 32 位整数,条件将始终为真。就是这样。
-
如前所述,您很可能需要 64 位整数,它们的可用性可能取决于您使用的架构。您使用的是哪种架构?或者至少告诉我们
sizeof(long)和sizeof(long long)gcc 报告了什么。如果是4,那么你就不走运了(或者至少问题变得更加困难),如果其中一个大于4,那么你可以使用它而不是unsigned。 -
使用 long long 变量而不是 unsigned int。
scanf的格式为“%ld”或“%”PRId64 -
@pradeep - 是的。如前所述,使用超过 32 位的变量。
-
您实际上应该从编译器收到“条件始终为真”警告。
标签: c linux gcc embedded-linux integer-overflow