为什么系统在没有警告的情况下接受 long int 作为 int 参数传递?
Why system accepts without warning long int passed as int argument?
简单的问题(几乎是出于好奇):
例如,如果我在 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 会给出:
warning: conversion to ‘int’ from ‘long int’ may alter its value
如果问题是为什么默认情况下不启用此类警告,那是因为许多非常常见的代码模式会由于自动升级而产生大量虚假警告。例如,unsigned char p[10]; ... p[1] ^= 1;
.
简单的问题(几乎是出于好奇):
例如,如果我在 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 会给出:
warning: conversion to ‘int’ from ‘long int’ may alter its value
如果问题是为什么默认情况下不启用此类警告,那是因为许多非常常见的代码模式会由于自动升级而产生大量虚假警告。例如,unsigned char p[10]; ... p[1] ^= 1;
.