在C中进行基本检查时出现奇怪的数学错误

Chr*_*s B 1 c

对于一个简单的程序,分配是创建一个接受十位数电话号码的程序,然后将其读回给用户.需要进行控制以确保:

  1. 第一个数字不是0.

  2. 输入的数字是十个数字.

错误检查似乎很简单; 我想使用while循环来确保数字的范围在1000000000和9999999999之间可以解决,并且根据独立的计算,它似乎应该.

while ((MDN - valueCheck < 0) || (MDN > 9999999999)) {
  printf("Entered number is not ten digits. Please re-enter.\n");
  scanf("%d", &MDN);
}
Run Code Online (Sandbox Code Playgroud)

这两个MDNvalueChecklong long类型变量(这样的范围内可以走过去2,147,483,647; IIRC很长很长为64位),但他们似乎仍然被列为32位整数,如进入2147483647出来就好了(或者更低的电话号码作品同样),但输入2,147,483,648(或以上任何内容)会使其显示为-2147483647.

与上述相关,输入一个更高的数字,不仅值环绕32位整数的范围,而且printf循环后语句打印的电话号码总是等于输入的数字减去两倍的限制32位整数.

是否有任何简单的方法使程序实际工作在64位数字,就像我想要的那样?如果我可以使数学正常工作,该算法似乎很可靠.

Cha*_*rns 5

尝试scanf("%lld", &MDN);而不是scanf("%d", &MDN);

来自man scanf:

ll (ell ell)
              Indicates that the conversion will be one of dioux or n and the
              next pointer is a pointer to a long long int (rather than int).
Run Code Online (Sandbox Code Playgroud)