2011-02-27 81 views
10
unsigned short a; 
    char temp[] = "70000"; 
    a = atoi(temp); 
    printf("a: %d\n", a); 

給我輸出a: 4464它應該是a: 70000有沒有更好的方法來從ASCII轉換爲小數?無符號短的範圍爲0 - 65535打印無符號短值

回答

8

您正在回答問題。 unsigned short的範圍是0-65535,所以70000不適合它(2個字節),請改用4個字節的數據類型(unsigned int應該可以工作,可以用sizeof檢查大小)。

+1

那麼這是爲我的計算機科學家庭作業,我們必須使用數據類型無符號短 – foo 2011-02-27 17:48:49

+3

@mateo:那麼,你不能適應70000到2字節,句點。如果作業要求你嘗試,答案是「我不行,老師也不行」。但它可能不會,所以再讀一遍,如果你想讓我們回答,請告訴我們確切的措詞。 – delnan 2011-02-27 17:49:11

+2

在這種情況下,您只能在兩個未簽名的短褲中儲存70000,但不能儲存在一個。聽起來很奇怪。 – schnaader 2011-02-27 17:50:56

8

由於schnaader said,您可能會遇到溢出問題。

但回答有關輸出無符號值的問題printf,您需要u修飾符(用於「無符號」)。在這種情況下,如延低於所指出的,你想%hu

printf("a: %hu\n", a); 

...雖然只是%uunsigned int,而不是unsigned short)可能會工作爲好,因爲short會得到提升到int當被推入堆棧printf

但是,只有70000的值適合您的平臺上的unsigned short

+6

如果'a'是'unsigned short','%hu'是正確的說明符。 – 2011-02-27 17:54:34

+0

@Jens:謝謝。是否在C標準中定義了'h'說明符? (不是C++,不是特定的編譯器。)我的回憶(這是生鏽的!)是當像'printf'這樣的可變參數情況下將'short'值轉換爲'int'時。編輯:我從中得到預期的輸出('42,60000,42'),例如:http://pastie.org/1613793'gcc -Wall'沒有給我任何警告(GCC 4.4.3)。但是,當然,這可能只是某種東西,某處幫助我,可能是特定於我的架構或編譯器等等。:-) – 2011-02-27 18:03:19

+1

是的,它是C99。是的,如果'unsigned short'適合它,則參數被提升爲'int',否則'unsigned int'。但這只是一個不同的事情,格式說明符告訴'printf'如何解釋它接收到的'int'。 – 2011-02-27 19:56:32