转换说明符如何工作?

时间:2014-03-24 09:30:52

标签: c scanf standard-library

我可以检查一下我对scanf的理解吗?

int a;
scanf("%d",&a);

如果我输入13,转换说明符是否将13转换为二进制并将其存储在a中?

如果输入是13.3,那么它是否将十进制小数13.3转换为二进制并将其存储在?

4 个答案:

答案 0 :(得分:0)

我不知道你在C中的知识,但是C中数据存储的确是非常重要和有趣的话题。 每当数据存储在变量中时它总是以二进制格式存在,就不可能用简单的C语言看到那个二进制数据,但是你可以在嵌入式C中看到二进制数据。我们在任何端口传递数据或者在内部提供数据的任何程序然后将输出发送到连接到led的任何端口。 假设如果你在一个端口传递-1并且端口正在将输出发送到与之连接的led,那么你可以看到与它连接的所有LED都会发光。 在C中你可以像这样观察

char c=-1;

printf("%u",c); 

输出= 255 %u用于无符号整数,它不是一个错误,你可以检查它。 int和char总是以相同的方式存储意味着如果你尝试存储char A然后我认为它的ASCII值65将以二进制方式存储。

char ch='A';
printf("%d",ch);
output 65 

相同

int i=65;
printf("%c",i);

输出A; 但是浮点存储完全不同于它有三个不同的部分,一个是符号位,第二个是尾数,然后是指数。 假设

float f=5.55;
if(f==5.55)
pf("true");
else 
pf("false");
output : false

现在再次

float f=5.25;
if(f==5.25)
pf("true");
else 
pf("false");

输出:true 所以关于数据存储在内存中非常重要的主题一般老师不在他们的课堂上讨论。 希望充分利用你。

答案 1 :(得分:0)

OP:如果我输入13,转换说明符是否将13转换为二进制并将其存储在?
中 答:是的。当用户输入 1 3 输入时,scanf("%d", ...)接收可选的前导空格(没有),然后{ {1}} char'1''3'。看到'\n'不是数字,它会被放回'\n'以进行下一次IO操作。 stdin'1'转换为'3',值为13 **。 13存储在int&a然后返回值1,但遗憾的是代码不使用。

OP:如果输入是13.3,那么它是否将十进制小数13.3转换为二进制并将其存储在?
中 答:不是。scanf()如上所述读取文本,但不是停留在scanf("%d", ...),而是停在'\n'并将其放回后续IO。 '.''1'转换为13并存储在'3'中。下一个IO操作将从&a开始。并可能造成麻烦。

建议:

'.'

存在其他方法,例如使用char buf[40]; fgets(buf, sizeof buf, stdin); if (sscanf(buf, "%d", &a) != 1) Handle_IntNotEntered(buf); ,但重要的问题是用户输入各种意外文本,输入需要验证和错误处理。

** 13通常以二进制形式存储 - 我知道没有其他机器。但是如何存储13的细节不应该有所作为。如果strtol()以二进制文件BCD13 chipmunks running on 13 wheels存储,则a的值为13。

答案 2 :(得分:-1)

简而言之,是的。计算机可以存储不同的编码数据。有些机器是little endian some are big endian

对于您可以参考的浮点数,
IEEE floating point

答案 3 :(得分:-1)

总之没有。但是你可以将代码更改为几乎可以工作。

float a;
scanf("%f",&a);

但是.3永远不能完全存储在浮点数中。

还有一个十进制类型,一个基于十进制的浮点数(与基于二进制的浮点数相反)。它可以精确地存储0.3(以及您可以键入的所有其他数字,直到其精度)。但是你仍然无法存储1/3(你需要一个分数存储来精确存储)。或者π(你需要一个符号存储来存储它)。但是,您并不总是需要精确。