快速简单的问题(几乎是出于好奇):
如果我在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;
}
很可能是因为您没有在编译器中启用该功能。例如,使用启用了转换警告的GCC可以:
警告:从'long int'转换为'int'可能会改变其值
如果问题是默认情况下未启用此类警告的原因,那是因为许多非常常见的代码模式会因自动升级而产生大量虚假警告。例如,unsigned char p[10]; ... p[1] ^= 1;
。