[英]How does conversion specifier work?
我可以檢查一下我對scanf的理解嗎?
int a;
scanf("%d",&a);
如果我輸入13,並轉換說明轉換13為二進制,並將其存儲在a
?
如果輸入為13.3,那么它將十進制小數13.3轉換為二進制並將其存儲在a中嗎?
我不了解您對C的了解,但是如何在C中存儲數據確實是非常重要且有趣的話題。 每當數據以變量形式存儲時,它始終都是二進制格式,就不可能用簡單的C語言看到該二進制數據,但是可以看到嵌入式C中的二進制數據。我們在任何通過端口或內部提供數據的程序中傳遞數據,然后將輸出發送到連接到LED的任何端口。 假設如果您在端口中傳遞了-1,並且該端口正在將輸出發送到與其連接的LED,則您可以看到與其連接的所有LED都將發光。 在C中,您可以像這樣觀察
char c=-1;
printf("%u",c);
output = 255%u用於無符號整數,這不是可以檢查的錯誤。 int和char總是以相同的方式存儲,這意味着如果您嘗試存儲char A,那么我認為它的ASCII值65將以二進制方式存儲。
char ch='A';
printf("%d",ch);
output 65
相同
int i=65;
printf("%c",i);
輸出A; 但是float與int完全不同,它具有三個不同的部分:一個是符號位,第二個是尾數,然后是指數。 假設
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");
output:true,所以所有有關內存中數據存儲的問題都是非常重要的主題,通常老師不在他們的課堂上討論。 希望對您有用。
OP:如果我輸入13,轉換說明符是否將13轉換為二進制並將其存儲在a中?
答:可以。 當用戶輸入1,3, 輸入 , scanf("%d", ...)
接收可選的前置空白(這是沒有的),則該char
小號'1'
'3'
和'\\n'
看到'\\n'
不是數字,它將被放回stdin
以進行下一個IO操作。 '1'
, '3'
轉換為值為13 **的int
。 13存儲在&a
。 scanf()
然后返回值1,不幸的是該代碼未使用。
OP:如果輸入為13.3,那么它將十進制小數13.3轉換為二進制並將其存儲在a中嗎?
答:否scanf("%d", ...)
如上所述讀取文本,但不是停在'\\n'
而是停在'.'
並將其放回后續的IO。 '1'
, '3'
將轉換為13並存儲在&a
。 下一個IO操作將從'.'
開始'.'
。 並可能引起麻煩。
建議:
char buf[40];
fgets(buf, sizeof buf, stdin);
if (sscanf(buf, "%d", &a) != 1) Handle_IntNotEntered(buf);
還存在其他方法,例如使用strtol()
,但是重要的問題是用戶輸入各種意外文本,並且輸入需要驗證和錯誤處理。
** 13通常以二進制形式存儲-我知道沒有其他機器可以這樣做。 但是如何存儲13的細節應該沒有什么不同。 a
以二進制, BCD或13個花栗鼠在13個輪子上運行的方式存儲,則a
的值為13 。
簡而言之,沒有。 但是您可以將代碼更改為幾乎可以工作。
float a;
scanf("%f",&a);
但是, .3
永遠不能完全存儲在浮點數中。
還有一種十進制類型,一種基於十進制的浮點數(與基於二進制的浮點數相反)。 它可以精確地存儲0.3(以及您可以鍵入的所有其他數字,直至其精度)。 但是您仍然不能存儲1/3
(您需要一個小數存儲來精確存儲它)。 或π(您需要一個符號存儲來存儲它)。 但是,您不必總是很精確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.