i具有long long
参数的C程序。当我尝试将这漫长的二进制表示形式转换为二进制表示。但是,如果我设置一个等于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()是该解决方案的复制糊。
有人可以清除发生的事情吗?
main的签名是
int main(int argc, char** argv)
不幸的是,c编译器可以很宽松,所以可能发生的是您指向char*
的指针默默地施放给long long
,导致胡说八道。
您需要实际解析参数,例如使用strtoll
。
与没有-Wall
编译器标志的C一起使用CAISS问题。启用了所有警告后,您将立即找到该问题:
warning: second argument of ‘main’ should be ‘char **’ [-Wmain]
int main (int argc, long long value)
^~~~
您代码中 main()
的签名
int main(int argv, long long value)
对于托管环境而言是无效的,是错误的。第二个参数应该为char **
类型。通过将argc
等效定义为long long
,您正在尝试将char **
类型接收到long long
类型中,该类型会导致不确定的行为,因为它们不是兼容类型。
换句话说,所提供的命令行参数作为指向字符串的指针。您需要应用适当的转换才能使它们回到long long
或任何其他兼容类型。 strtoll()
只是为此目的而制造的。
引用C11
,第§5.1.2.2.1章,
在程序启动时调用的函数命名为
main
。实施声明否 此功能的原型。它应使用int
的返回类型定义,没有 参数:int main(void) { /* ... */ }
或两个参数(此处称为
argc
和argv
,尽管任何名称都可能是 使用,因为它们是声明的函数的本地):int main(int argc, char *argv[]) { /* ... */ }
或等效; 10)或其他某些实现方式。
和,第2段,
- 如果
argc
的值大于零,则数组成员argv[0]
通过argv[argc-1]
包含在弦上的指针, 在程序启动之前,主机环境实现定义的值。这 意图是在计划启动之前确定的程序信息 来自托管环境中的其他地方。如果主机环境没有能力 在大写和小写中都提供字母 应确保以小写为单位接收字符串。- 如果
argc
的值大于零,则字符串指向argv [0] 代表程序名称;如果argv[0][0]
为null字符,如果 程序名称在主机环境中不可用。如果argc
的值为 大于一个,通过argv[1]
通过argv[argc-1]
指向的字符串 表示程序参数。