C++ 为什么系统在没有警告的情况下接受作为int参数传递的长int?

C++ 为什么系统在没有警告的情况下接受作为int参数传递的长int?,c++,integer,long-integer,C++,Integer,Long Integer,简单快速的问题(几乎出于好奇): 如果我在C++程序中声明一个“代码> long int ,然后调用一个函数,使用 int ,我知道它不会有任何问题,除非我给它一个4字节的大小值,否则会导致打印内容不好。 然而,令我惊讶的是,它并没有以任何方式对此发出警告。如果我声明一个4字节长的int,系统知道它有32位来存储该值。但是,如果我将相同的long int传递给一个只调用int(2字节)的函数,我假设我在内存中使用了16位,这个值不应该使用这些位 我说得对吗?或者它将只使用作为参数接收的long

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

如果我在C++程序中声明一个“代码> long int <代码>,然后调用一个函数,使用<代码> int <代码>,我知道它不会有任何问题,除非我给它一个4字节的大小值,否则会导致打印内容不好。 然而,令我惊讶的是,它并没有以任何方式对此发出警告。如果我声明一个4字节长的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;
}
#包括
无效测试(intx){//我的问题是它为什么接受这个?
printf(“%d”,x);
}
int main(){
长整数y=4294967200;//32位
试验(y);
返回0;
}

很可能是因为您没有在编译器中启用该功能。例如,在启用转换警告的情况下使用GCC可提供:

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


如果问题是为什么默认情况下不启用此类警告,那是因为许多非常常见的代码模式由于自动升级而产生大量虚假警告。例如,
无符号字符p[10]。。。p[1]^=1

你能用一个实际的代码示例向我们展示一下你在说什么吗?已经编辑好了。我的问题是,为什么它接受将长整型传递给一个假定只接收整型的函数。这是因为有一些隐式整数转换。是的,但实际会发生什么?收到时是否缩小到原来尺寸的一半?或者只是溢出整数本身?为了澄清,您确实是在
long
为64位的系统上编译的,对吗?因为在Windows(任何版本)或各种UNIX类的32位版本上,
long
int
通常是兼容的;没有数据丢失(除了前面的文字被截断)。我很乐意阅读你们关于全球现金、货币、金融犯罪的文章。我很少看到这样的事情,这让我意识到仍然有人在思考。