2010-03-04 46 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