2010-10-22 48 views
5

所以我只是在C上做些修改,並想知道是否可以將一個二進制值賦給一個整數,並使用printf()函數輸出一個有符號或無符號的值。但是,無論我得到的輸出是否相同,我都認爲打印簽名的價值與未簽名的價值相比要低一半。我使用Code :: blocks和GCC。打印此int時爲什麼會得到相同的值?

是否printf()忽略了%i &%u並使用變量定義?

示例代碼:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    signed int iNumber = 0b1111111111111111; 
    printf("Signed Int : %i\n", iNumber); 
    printf("Unsigned Int : %u\n", iNumber); 

    return 0; 
} 

同樣的結果,如果我改變INT無符號:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    unsigned int iNumber = 0b1111111111111111; 
    printf("Signed Int : %i\n", iNumber); 
    printf("Unsigned Int : %u\n", iNumber); 

    return 0; 
} 
+2

你確定你的int類型只有16位寬嗎? – 2010-10-22 20:36:05

+2

什麼是'charCount'? – Donotalo 2010-10-22 20:36:36

+2

請注意,像'0b1111'這樣的二進制常量語法不是ISO標準C. – 2010-10-22 21:22:54

回答

3

因爲對於正數,在大多數平臺上的二進制表示符號和無符號之間的相同。

+0

適用於有符號整數的正數(因爲其他正數不能表示爲有符號整數,因此它們作爲有符號整數的表示不能表示爲無符號整數) ;-) – ninjalj 2010-10-22 21:44:30

+0

事實上,除了上述的挑剔之外,C標準要求這樣做。 – jilles 2010-10-23 20:51:28

6

我假設charCount應該是iNumber。這兩個程序都有未定義的行爲,因爲您使用了錯誤的轉換說明符一次。

在實踐中(對於大多數實現),printf依賴於您告訴它彈出堆棧的內容;這是必要的,因爲它是一個可變參數函數。 va_arg需要彈出的類型作爲第二個參數

這些位在賦值之前和之後的程序之間是相同的。所以printf指向不同類型指針的相同位。

你得到相同結果爲%i%u的原因是最左邊的位未被設置,所以它被解釋爲兩個說明符都是正數。

最後,你應該注意的是二進制文字(0b)是一個GCC擴展,也不是標準C.

+0

謝謝,我將它改爲'0xFFFFFFFF'和'0x7FFFFFFF'(使用標準C十六進制的32位整數),並得到了預期的結果。 – ProfessionalAmateur 2010-10-23 21:24:00

0

結果只會比數值爲0x7FFFFFFF高有所不同,因爲它是在幾乎所有系統的位與最高用於標記標誌的重量。爲了加快CPU內部的計算速度,其他位反轉,因此0xFFFFFFFF爲-1,0x80000000爲-MAXINT-1,而0x7FFFFFFF爲MAXINT。

2

首先,你似乎正在打印一個名爲charCount的東西,沒有錯誤,並且b指定數字的方法不是標準C.我會檢查以確保它按照你的想法進行。對於指定位模式的標準方式,使用八進制(數字以零開頭)或十六進制(數字以零和x)格式開頭。其次,幾乎所有計算機對於一個正整數和它的無符號等價物都有相同的二進制表示,所以不會有任何區別。如果數字是負數,則會有所不同,並且通常取決於最重要的位。你int小號可以從多達16位的任何大小,雖然臺式機,筆記本電腦或服務器上它很可能是32,而且幾乎可以肯定是32或64。

三,printf()一無所知的類型你傳遞給它的數據。當被調用時,它甚至無法知道其論據的大小,或者有多少。它從格式說明符中得出結論,如果那些不同意通過的參數可能會有問題。這可能是關於printf()的最糟糕的事情。

+0

即使是負數,他在實踐中也會得到相同的結果,因爲從signed到unsigned的賦值不會改變二進制補碼上的位模式。 – 2010-10-22 20:50:42

+0

@Matthew:假設他打印的是相同的位模式,他將得到負數的不同結果,例如-1和65535分別代表有符號和無符號的16位全二進制補碼。將一個負數賦給一個無符號的結果得到一個很大的正數,而我認爲將一個大的無符號值賦給一個有符號的值是未定義的。 – 2010-10-22 21:06:57

+0

我應該更清楚了。我的意思是兩個方案之間的相同。 – 2010-10-22 21:20:31

0

您可能有32位整數。在這種情況下,這意味着您的iNumber的值爲32767,不管它是有符號還是無符號。

相關問題