![](/img/trans.png)
[英]Why do i get the same string value but different arithmetic values when printing from a Doubly Linked List
[英]Why do I get the same value when printing this int?
所以我只是在修補C並希望看看我是否可以將二進制值分配給整數並使用printf()函數輸出有符號或無符號值。 但是無論我得到相同的輸出,我都認為與無符號相比,打印簽名的價值只有一半。 我正在使用Code :: blocks和GCC。
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更改為unsigned,結果相同:
#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;
}
我假設charCount
應該是iNumber
。 兩個程序都有未定義的行為,因為您使用了錯誤的轉換說明符一次。
在實踐中(對於大多數實現), printf
依賴於你告訴它從堆棧中彈出什么; 這是必要的,因為它是一個可變參數函數。 va_arg
將類型彈出為第二個參數
分配之前和之后的程序之間的位是相同的。 因此printf
指向具有不同類型指針的相同位。
你得到%i
和%u
相同結果的原因是最左邊的位未設置,所以它被解釋為兩個說明符都是正數。
最后,您應該注意二進制文字( 0b
)是GCC擴展,而不是標准C.
因為對於正數,大多數平台上的二進制表示在有符號和無符號之間是相同的。
首先,你似乎是打印一些所謂的charCount
,沒有錯誤,而b
指定數量的方式也不是標准C.我檢查,以確保它在做什么,你認為它是。 對於指定類似位模式的標准方法,請使用八進制(數字以零開頭)或十六進制(數字以零和x
開頭)格式。
其次,幾乎所有計算機都具有相同的正整數及其無符號等價的二進制表示,因此沒有區別。 如果數字為負數則會有所不同,這通常取決於最重要的位。 你的int
可以是16位以上的任何大小,雖然在台式機,筆記本電腦或服務器上,它很可能是32位,幾乎可以肯定是32或64位。
第三, printf()
對傳遞給它的數據類型一無所知。 當被調用時,它甚至無法知道其參數的大小,或者有多少。 它從格式說明符派生出來,如果那些與傳遞的參數不一致,則可能存在問題。 這可能是printf()
最糟糕的事情。
結果將僅對於高於0x7FFFFFFF的值不同,因為在幾乎所有系統上,具有最高權重的位用於標記符號。 為了在CPU內部進行更快的計算,其他位被反轉,因此0xFFFFFFFF為-1,0x80000000為-MAXINT-1,而0x7FFFFFFF為MAXINT。
你可能有32位的整數。 在這種情況下,這意味着您的iNumber的值為32767,無論它是有符號還是無符號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.