1. 程式人生 > >printf和scanf函式、unsigned無符號運算子

printf和scanf函式、unsigned無符號運算子

#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;
}

Unsigned int 能儲存負數

今天在看《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佔位符