【问题标题】:Why system accepts without warning long int passed as int argument?为什么系统在没有警告的情况下接受 long int 作为 int 参数传递?
【发布时间】:2016-10-18 10:55:21
【问题描述】:

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

例如,如果我在 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;
}

【问题讨论】:

  • 你能用一个实际的代码示例向我们展示你在说什么吗?
  • 已编辑。我的问题是为什么它接受将 long int 传递给假定只接收 int 的函数。
  • 这是因为你有一些隐式的整数转换。
  • 是的,但实际发生了什么?收到后会缩小一半吗?或者只是溢出整数本身?
  • 为了清楚起见,您确实在 long 为 64 位的系统上编译了它,对吧?因为在 Windows(任何类型)或各种 UNIX 类似物的 32 位版本上,longint 通常是兼容的;没有数据丢失(除了文字被预先截断)。

标签: c++ integer long-integer


【解决方案1】:

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

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

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

【讨论】:

  • 我沉迷于阅读您关于全球现金、货币、金融犯罪的文章。我很少看到这样的事情,这让我意识到仍然有人在思考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
相关资源
最近更新 更多