当我建立一个简单的程序让用户决定一个数字时(size_t num
),我不明白为什么要输入负数导致输出大量而不是错误消息。
例如,如果用户将-1作为变量写入,则程序的输出将返回巨大的数字。
size_t num;
printf("enter num:");
scanf("%lu",&num);
printf("%lu",num);
size_t
是unsigned int
。在数字的二进制表示中,第一位表示符号(对于signed int
),因此当计算机读取数字即认为它是size_t
时,它将不会将第一位解释为负号,而是将其解释为部分号码。由于它是第一位,即2的最高幂,因此得到的数字很大。您可以在此处阅读有关二进制表示的更多信息:https://en.wikipedia.org/wiki/Binary_number
没有错误,因为计算机只是读取变量中在内存中指示的位,并且它代表有效的size_t
,因此计算机现在有办法知道这是错误的。
%u
格式说明符实际上将接受带符号整数的字符串表示形式,并将结果转换为无符号整数。
关于C standard功能(并扩展为fscanf
的scanf
的7.2.1.2节说关于u
转换说明符的以下内容:
匹配一个可选的带符号十进制整数,其格式为与
strtoul
的主题序列相同base
参数的值为10的函数。的相应的参数应为指向无符号整数的指针。
从有符号到无符号的转换是通过将无符号类型可以保持+1的最大值逻辑地加到有符号类型的数值上,直到结果在无符号类型的范围内。请注意,无论相关整数类型的基本表示形式如何,都会发生这种情况。
因此,例如,假设size_t
是64位类型,它可以容纳的最大值是18446744073709551615615。因此,如果输入-1,则将18446744073709551616添加到-1,得到18446744073709551615这是结果。