从控制台读取值后,我试图打印一个特别大的值。当我尝试以两种不同的方式打印它时,一种是在赋值后直接打印,另一种是使用strtol函数的返回值,那么我得到了不同的输出!有人可以解释一下为什么我注意到两个不同的输出吗?输入值为:4294967290这是代码片段。long int test2 = strtol(argv[1], &string, 10);printf("the strtol value is %ld\n", test2);printf("the strtol function value is %ld\n", strtol(argv[1], &string, 10));输出量the strtol value is -6the strtol function value is 4294967290 最佳答案 您需要做两件事:在程序的开头添加#include <stdlib.h>行。这将导致strtol被声明。 (您还需要#include <stdio.h>才能声明printf。)将-Wall添加到编译器标志中(如果使用的是gcc或clang)。这将导致编译器告诉您需要声明strtol,甚至可能会建议要包含哪个标头。发生的情况是您没有声明strtol,结果是编译器假定它返回了int。由于4294967290是232-6,因此它是-6的32位Two's-complement表示。因为编译器假定strtol返回int,所以它生成的代码仅查看低阶32位。由于您是将值分配给long,因此编译器需要发出对int进行符号扩展的代码。换句话说,它将低阶32位当作一个有符号整数(将是-6),然后将-6扩展为long。在第二次调用printf时,将strtol的返回值插入到printf参数列表中,而无需进行转换。您告诉printf该参数是long(通过使用l中的%ld标志),幸运的是,整个64位都在参数列表中,因此printf将它们读出为并打印“正确”值。不用说,所有这些都是不确定的行为,您所看到的实际输出绝不能得到保证。它恰好可以在您的体系结构上与您的编译器一起工作。在某些其他编译器或某种其他体系结构上,情况可能完全不同,包括long和int的位长。因此,以上解释虽然可能很有趣,但没有实际价值。如果只包含正确的标头,从而告诉编译器long的实际返回类型,那么您将获得预期的输出。关于c - 与printf不同的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32545771/
10-12 02:11