扫描数据多于预定义值的数字

Ach*_*hal 2 c scanf

#include<stdio.h>
main()
{

        unsigned int num;
        printf("enter the number:\n");
        scanf("%u",&num);//4294967299 if i'm scanning more than 4G its not scanning
        printf("after scanning num=%u\n",num);// 4294967295 why its giving same 4G

        /*      unsigned char ch;
                printf("enter the character:\n");
                scanf("%d",&ch);// if i/p=257 so its follow circulation
                printf("after scanning ch=%d\n",ch);// 1 its okk why not in int ..
         */
}
Run Code Online (Sandbox Code Playgroud)

为什么在扫描输入时循环没有跟随scanf(),为什么它会跟随char

Ant*_*ala 6

C11标准草案n1570 7.21.6.2说明如下

第10段

[...]输入项[...]转换为适合转换说明符的类型.如果输入项不是匹配序列,则指令的执行失败:此条件是匹配失败.除非由a指示赋值抑制,否则*转换的结果将放在由尚未收到转换结果的format参数后面的第一个参数指向的对象中.如果此对象没有适当的类型,或者无法在对象中表示转换结果,则行为未定义.

现在,这里的"转换"一词用于string =>结果数据类型转换,它不能理解为整数转换.由于"4294967299"转换为十进制整数的字符串在unsigned int32位宽的类型的对象中无法表示,因此标准的读取表明行为未定义,即

使用不可移植或错误的程序结构或错误数据时的行为,本国际标准不对此要求

因此,您的问题的答案是C标准没有说明这种情况下的行为,您看到的行为是您的编译器和C库实现所展示的行为,并且不可移植; 在其他平台上,可能的行为可能包括:

完全忽略这种情况,结果不可预测,在翻译或程序执行过程中以环境特征(有或没有发出诊断信息)的特定文件表现,终止翻译或执行(发布诊断信息) .