为什么系统接受没有警告long int作为int参数传递?

时间:2016-10-18 10:55:21

标签: c++ integer long-integer

快速简单的问题(几乎是出于好奇心):

如果我在C ++程序中声明一个long int,然后在一个带int的函数中调用它,我知道它会正常工作,除非我给它一个4字节的大小这将导致印刷内容不良。

但令我惊讶的是,它并没有以任何方式对此发出警告。如果我声明一个4字节long int,系统知道它有32位来存储该值。但是,如果我将同一个long int传递给一个只调用int(2个字节)的函数,我假设我在内存中使用了16位,而不应该是&{这个值可以使用。

我是对的吗?或者它只使用收到的long int作为参数的最低16位?这是什么过程?

代码示例:

#include <stdio.h>

void test(int x) { // My question is why it accepts this?
    printf("%d", x);
}


int main() {
    long int y=4294967200; // 32 bits

    test(y);
    return 0;
}

1 个答案:

答案 0 :(得分:2)

很可能是因为您没有在编译器中启用该功能。例如,使用启用了转换警告的GCC会给出:

  

警告:从'long int'转换为'int'可能会改变其值

如果问题是默认情况下未启用此类警告的原因,那是因为许多非常常见的代码模式会因自动升级而产生大量虚假警告。例如,unsigned char p[10]; ... p[1] ^= 1;