为什么转换为Size_t的负数会在C中返回大量数字

问题描述 投票:0回答:2

当我建立一个简单的程序让用户决定一个数字时(size_t num),我不明白为什么要输入负数导致输出大量而不是错误消息。

例如,如果用户将-1作为变量写入,则程序的输出将返回巨大的数字。

size_t num;
printf("enter num:");
scanf("%lu",&num);
printf("%lu",num);
c unsigned size-t
2个回答
0
投票

size_tunsigned int。在数字的二进制表示中,第一位表示符号(对于signed int),因此当计算机读取数字即认为它是size_t时,它将不会将第一位解释为负号,而是将其解释为部分号码。由于它是第一位,即2的最高幂,因此得到的数字很大。您可以在此处阅读有关二进制表示的更多信息:https://en.wikipedia.org/wiki/Binary_number

没有错误,因为计算机只是读取变量中在内存中指示的位,并且它代表有效的size_t,因此计算机现在有办法知道这是错误的。


0
投票

%u格式说明符实际上将接受带符号整数的字符串表示形式,并将结果转换为无符号整数。

关于C standard功能(并扩展为fscanfscanf的7.2.1.2节说关于u转换说明符的以下内容:

匹配一个可选的带符号十进制整数,其格式为与strtoul的主题序列相同base参数的值为10的函数。的相应的参数应为指向无符号整数的指针。

从有符号到无符号的转换是通过将无符号类型可以保持+1的最大值逻辑地加到有符号类型的数值上,直到结果在无符号类型的范围内。请注意,无论相关整数类型的基本表示形式如何,都会发生这种情况。

因此,例如,假设size_t是64位类型,它可以容纳的最大值是18446744073709551615615。因此,如果输入-1,则将18446744073709551616添加到-1,得到18446744073709551615这是结果。

© www.soinside.com 2019 - 2024. All rights reserved.