簡體   English   中英

c中的short和int

[英]short and int in c

short int a,b,c;
scanf("%d%d",&a,&b);
c = a + b;
printf("%d %d %d",a,b,c);

輸入: 5 8

輸出: 0 8 8

為什么值a 0? 任何人都能解釋一下嗎?

平台--- GCC ubuntu 10.04

具有"%d"格式的scanf需要int*參數。 你給它一個short int*參數,因此你的程序的行為是未定義的。

如果你真的想知道為什么你得到你得到的結果,我可以推測,但更正你的代碼更容易:

scanf("%hd%hd", &a, &b);

您可以繼續對printf使用"%d" ,因為short int參數被提升為int 您可以在printf使用"%hd" ,但這不是必需的。 (對於int*沒有類似的short int*參數的提升。)


你可以放心地在這里停止閱讀。


以下是關於您的錯誤代碼中可能發生的事情的一些猜測。 這不是解決方案; 解決方案是糾正您的代碼,使其完成您希望它執行的操作。 但是,如果錯誤的代碼行為不當,可能會有所幫助。

假設short是16位, int是32位,這是典型的。 格式字符串中的第一個"%d"告訴scanf讀取一個值(您給它5 )並將其存儲到第二個參數&a指向的32位int中。 由於a只有16個buts,它會將一半的32位值存儲在a ,另一半存儲在一些相鄰的內存塊中。 第二個"%d"&b做同樣的事情; 它存儲的32位表示的一半8b ,而另一半在別處。

根據您的輸出,似乎第二個"%d"導致scanf將值8的低16位存儲在b ,而高階16位(值為0)存儲在a ,覆蓋存儲的值由第一個"%d" 請注意,第一個"%d"中的高16位可能存儲在其他位置,可能會破壞其他一些變量,或者可能寫入一些未使用的內存。

所以結果是,你已經存儲在第0 a和8 b ,這說明你得到的輸出。

所有這些都是非常具有推測性的,許多其他結果都是可能的。 這種分析用於跟蹤錯誤代碼的行為,目的是糾正它。 編寫故意利用這種東西的代碼是一個非常糟糕的主意。 該語言完全沒有說明像這樣的錯誤代碼會做什么; 它的行為可能在不同的系統上有很大的不同,有不同的編譯器設置,甚至取決於月亮的相位。

根據這個:

http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

如果您的變量是“short”int而不是常規int,則需要指定修改

在VC ++ 6.0中, c值為13。

#include <stdio.h>

int main()
{

short int a,b,c;
 scanf("%d%d",&a,&b);
 c = a + b;
 printf("%d + %d = %d\n",a,b,c);


return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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