C:二进制命令行参数与二进制局部变量不同

标签 c binary command-line-arguments long-long

我有一个 C 程序,它接受一个 long long 参数。当我尝试将这么长的值转换为其二进制表示形式时,结果发现一切都是错误的。但是,如果我设置一个等于 long long 参数值的 long long 变量,那么我会得到正确的二进制表示形式。

  int main(int argv, long long value)
{
        long long i = value; // value = 2
        long long e = 2;
        printBits(sizeof(e), &e); // 0000000000000000000000000000000000000000000000000000000000000010
        printBits(sizeof(i), &i); // 0000000000000000011111111111110000010000111010101110101000001000
        return 0;
}

因此,正如您在上面看到的那样,通过控制台检索到的参数作为输入与应有的内容相差甚远。

printBits() 是此 solution. 的复制粘贴

有人可以澄清发生了什么吗?

最佳答案

main 的签名是

int main(int argc, char** argv)

不幸的是,C 编译器可能非常宽松,因此可能发生的情况是,指向 char* 的指针被默默地转换为 long long,从而导致无意义的结果。

您需要实际解析参数,例如使用strtoll

在没有 -Wall 编译器标志的情况下使用 C 是自找麻烦。启用所有警告后,您会立即发现问题:

warning: second argument of ‘main’ should be ‘char **’ [-Wmain]
int main (int argc, long long value)
    ^~~~

关于C:二进制命令行参数与二进制局部变量不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46240078/

相关文章:

c - Payne Hanek算法在C中的实现

c - libcurl 中的宏函数,它返回 libcurl 版本

Python - 将二进制解码为 boolean 值

linux - 在 Linux 和 Mac OS X 中使用 bash 读取/写入二进制文件中的字节?

c - 如何创建类似答案的输入

c 编程 scanf 有线行为

c++ - 知道哪个编译器用 C++ 生成特定的二进制文件至关重要吗?

java - 使用正则表达式删除逗号和空格并将它们划分为不同的变量

c - 为什么在 Linux 编译器中编译和运行 C 程序时需要额外的参数?

python - 如何使用 argparse 读取命令行的剩余部分?