簡體   English   中英

轉換說明符如何工作?

[英]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以二進制, BCD13個花栗鼠在13個輪子上運行的方式存儲,則a的值為13

簡而言之,是的。 計算機可以使用不同的編碼來存儲數據。 有些機器是小端,有些是大端

對於您可以參考的浮點數,
IEEE浮點數

簡而言之,沒有。 但是您可以將代碼更改為幾乎可以工作。

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

但是, .3永遠不能完全存儲在浮點數中。

還有一種十進制類型,一種基於十進制的浮點數(與基於二進制的浮點數相反)。 它可以精確地存儲0.3(以及您可以鍵入的所有其他數字,直至其精度)。 但是您仍然不能存儲1/3 (您需要一個小數存儲來精確存儲它)。 或π(您需要一個符號存儲來存儲它)。 但是,您不必總是很精確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM