printf和scanf函式、unsigned無符號運算子
阿新 • • 發佈:2019-02-18
#include <stdio.h>
int main()
{
int k=5, i=0;//定義的同時初始化
short n=2;
long j=10;
char ch='0';//字串
double db=5.5;
float fdx=15.5;
k = 10;//執行過程中 賦值
printf("%d\n", k);
scanf("%d", &k);//等待使用者從鍵盤上輸入
printf("%d\n", k);
return 0;
}
今天在看《C程式設計語言》的時候寫了如下一段程式碼
int main(void) { unsigned int a = -20; printf("%d", a); return EXIT_SUCCESS; }
Console: -20
理論上a宣告為unsigned int後不應該能顯示正確的值,這裡之所以能顯示-20是由於在printf的格式化引數中使用了%d, 該函式會首先將a轉化為int型別。
如果你對編譯器的越界處理有所瞭解的話,應該知道這時候一般情況下,a所表示的值為4294967276(在32位機器中,int用32位bit來表示,無符號int所能表示的最大數為4294967296)
說說我所理解的編譯器對上述程式碼的處理:
1. -20為int型別,第2行賦值語句將它強行轉化為unsigned int型別, 越界,因為unsigned int和int在記憶體中儲存的位數是一樣的,因此兩者在實體記憶體中是完全一樣的。
2. 第3行printf遇到%d佔位符時,即認為此處應顯示一個int型別值, 於是將a又轉化為int型別,所以此時顯示出來的結果跟原來賦值是一樣的
要想顯示無符號整型值,需要使用%u佔位符