簡體   English   中英

為什么在打印此int時會得到相同的值?

[英]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.

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