C程序Printf函数显示无符号长类型的异常行为? 请考虑下面的程序并观察输出。 #include <stdio.h> int main() { unsigned long long val ; val =144111444250; printf ("%llu\n", val); printf ("%u %llu\n",val, val); return 0; }
在第一个printf中使用%llu会给出正确的结果,但在第二个printf中使用%llu会给出错误的结果 这是未定义的行为:C程序Printf函数显示无符号长类型的异常行为? 请考虑下面的程序并观察输出。 #include <stdio.h> int main() { unsigned long long val ; val =144111444250; printf ("%llu\n", val); printf ("%u %llu\n",val, val); return 0; },c,unix,printf,solaris,C,Unix,Printf,Solaris,在第一个printf中使用%llu会给出正确的结果,但在第二个printf中使用%llu会给出错误的结果 这是未定义的行为:printf要求%u使用无符号int,但您提供了无符号long long int,之后发生的任何事情都取决于编译器的奇想 printf和scanf的格式说明符不仅指示应如何打印/扫描某些内容,还指示应使用何种类型的参数。如果你撒谎,你就不能期望结果是合理的。你的编译器应该警告你不要将%u与长无符号类型一起使用。%u只从堆栈中弹出val的一部分。之后,%llu弹出sizeof
printf
要求%u
使用无符号int
,但您提供了无符号long long int
,之后发生的任何事情都取决于编译器的奇想
printf
和scanf
的格式说明符不仅指示应如何打印/扫描某些内容,还指示应使用何种类型的参数。如果你撒谎,你就不能期望结果是合理的。你的编译器应该警告你不要将%u
与长无符号类型一起使用。%u
只从堆栈中弹出val
的一部分。之后,%llu
弹出sizeof(unsigned long-long)
字节,其中包括第一次尝试打印val
的剩余部分。用%llu
替换%u
时,您的程序应该可以正常工作。您使用了无效的说明符,结果无效。谁会感到惊讶?@BoPersson:在第一个printf中使用%llu会给出正确的结果,但在第二个printf中使用%llu会给出错误的结果。这就是我的问题所在about@SHAAN-但第一种格式%u
是错误的。正如答案所说的那样——一旦有什么地方出了问题,其他地方也可能出问题。
144111444250
33 10211385600662044705