2016-02-17 48 views
0

我目前在教自己一點C,並從可執行文件收到一個奇怪的響應。這是代碼。程序在數據類型改變後不顯示第一個操作數

#include <stdio.h> 

int main() 
{ 
    int a, b; /* the operands in the arithmetic */ 

    while(1) { 
     printf("\n\n\n enter two integers: "); 
     scanf("%d %d", &a, &b); 
     printf("\n %d +  %d is %d", a, b, a + b); 
     printf("\n %d -  %d is %d", a, b, a - b); 
     printf("\n %d *  %d is %d", a, b, a * b); 
     printf("\n %d/ %d is %d", a, b, a/b); 
     printf("\n %d mod %d is %d", a, b, a % b); 
    } 
    return 0; 
} 

運行此操作時,使用如所示的int數據類型,它會生成以下輸出。

輸入兩個整數:32000 32000

32000 + 32000 is 64000 
32000 - 32000 is 0 
32000 * 32000 is 1024000000 
32000/32000 is 1 
32000 mod 32000 is 0 

正如你可以看到輸出是可以預期。但是,當int被替換爲short且沒有其他更改時,程序將生成以下輸出。

輸入兩個整數:32000 32000

0 + 32000 is 32000 
0 - 32000 is -32000 
0 * 32000 is 0 
0/32000 is 0 
0 mod 32000 is 0 

正如你可以清楚地看到該程序不再顯示第一個操作數,即使32000是海灣合作委員會的文件說可以通過短表示的範圍,這是內 - 32767至32767.我不明白這一點。

進一步的研究顯示,與scanf()的函數,我應該使用包括在格式規範修飾符H帶%HD替換%d。我的理解是,只使用%d與scanf()會導致編譯器或硬件「扔掉」前兩個字節。

我實在不明白的是爲什麼是隻有第一個操作的影響考慮scanf()的使用(不正確)%d格式說明符的兩個實例?

,你或許可以給任何幫助,將不勝感激。

最好的問候,

斯圖爾特

+2

從一本很好的C書中學習,而不是從在線教程中學習。這些教程很好的參考,但總是會讓你成爲一個有很多漏洞的c程序員。 –

+0

嗨阿希什,感謝您的答覆。我正在從一本書教我自己。它是由Kenneth E. Martin所着的「C through UNIX」。無可否認它是一本較舊的書,但確實需要我更多地關注語言中的關係。在這種情況下,聲明中使用的數據類型與要使用的最合適的格式說明符之間的關係,以及使用RAM的含義。也感謝關於教程的提示。我會牢記這一點。 – Stuart

回答

3

編譯器不能給你正確的結果,因爲你它(使用錯誤的格式說明)。

如果你想進入一個int,使用"%d";如果您想輸入short int,請使用"%hd"

否則,將導致不確定的行爲,其中從段錯誤的運行時崩潰的情況下什麼都可以發生。請記住,未定義的行爲不值得討論。

0

我認爲當輸入第二個變量b的值時,變量a佔用的內存被覆蓋,反之亦然。

它是圍繞陣列存儲器可以如果使用無效索引出指數對陣列的可接受範圍被覆蓋相同的效果。

相關問題