2010-03-04 71 views
-4

雖然從長到長分配,但LSB 2字節爲0,其中MSB填充了來自堆棧的func1()算法值中的值。爲什麼會發生這種情況,爲什麼編譯器試圖將這些垃圾值添加到MSB 2字節?無符號短符合無符號長賦值

#include <stdio.h> 

unsigned short func1(void); // NB: function prototype ! 

int main(void) 

{ 

    unsigned long int L = 0; 

    unsigned short K = 0; 

    L = func1(); 

     printf("%lu", L); // prints junk values 

     K = L; 

     printf("%u", K); // prints 0 

    return 0; 
} 

unsigned short func1(void) 

{ 

     unsigned short i = 0; 

     // Algorithm Logic!!! 

     return i; // returns 0 
} 
+0

你錯過了一些返回類型和原型。 func1()返回int,不短。 – 2010-03-04 14:38:08

+1

您已複製並粘貼我提供的固定代碼,但您尚未說明此問題是否解決了感知問題? – 2010-03-04 15:06:01

回答

5

unsigned long的說明符是lu。對於unsigned shorthu。您通過不使用適當的說明符來調用UB。

+0

假設'unsigned short'的範圍適合OP的平臺上的'int','%d'在第一個'printf'中是完美無缺的,因爲當unsigned short值被提升爲int時,傳遞給'printf'。第二個'printf'不正確。 – AnT 2010-03-04 14:44:57

+0

@dirkgently:???在C語言中,默認參數促銷*總是*應用於可變參數,如本例中使用'printf'。事實上,默認參數促銷*僅適用於未聲明的參數(可變參數或無原型)。這就是爲什麼他們被稱爲* default *。當聲明參數時,轉換不是* default *,而是特定的。 – AnT 2010-03-04 15:45:45

+0

是的。我錯過了6.5.2.2的第7段。 – dirkgently 2010-03-04 16:11:53

0

你的代碼有許多問題 - 這裏是一個固定的版本,應該正確運行。

#include <stdio.h> 

unsigned short func1(void); // NB: function prototype ! 

int main(void) 
{ 
    unsigned long int L = 0; 
    unsigned short K = 0; 

    L = func1(); 
    printf("%lu", L); 
    K = L; 
    printf("%u", K); 

    return 0; 
} 

unsigned short func1(void) 
{ 
    unsigned short i = 0; 

    // Algorithm Logic!!! 

    return i; // returns 0 
} 
+0

嗨保羅, 即使改變它沒有工作。我看到MSB充滿垃圾值和LSB爲0.是否是編譯器問題? – Pradna 2010-03-04 15:08:45

+1

你怎麼看?上面的程序在你的系統上產生了哪些輸出 - 以及你使用的編譯器是什麼? – nos 2010-03-04 15:13:27

+0

@Pradna - 上面的代碼在沒有'gcc -Wall'的警告的情況下編譯並生成期望的輸出(兩種情況都是0)。你使用什麼編譯器和操作系統? – 2010-03-04 15:50:36