为什么我不能使用" long long int"用" int"在我的C代码?

时间:2015-03-31 14:29:19

标签: c visual-studio-2012

为什么我不能在我的C代码中使用“long long int”和“int”?

int main(void) {
    long long int a;
    int b;
    a = 1000000000;
    b = 3200;
    printf("long long int a = %d\n int b = %d", a, b);
    return 0;
}
  

long long int a = 1000000000

     

int b = 0

5 个答案:

答案 0 :(得分:2)

您必须在printf函数中使用正确的格式说明符

printf("long long int a = %lld\n int b = %d", a, b);

否则函数行为未定义。

在给定的情况下,函数似乎将在函数堆栈上推送的long long int对象的值视为一个参数,就像两个int类型的对象一样。

答案 1 :(得分:2)

你可以试试这个:

printf("long long int a = %lld\n int b = %d", a, b);

%d用于引用int。如果您想引用long long int,则必须使用%lld

答案 2 :(得分:2)

使用错误的格式说明符会导致未定义的行为,打印出long long int的正确格式说明符为%lld

答案 3 :(得分:1)

C99标准说: 如果任何参数不是相应转换规范的正确类型,则行为未定义 a的类型为long long int,但您使用%d进行打印。

答案 4 :(得分:0)

有两个可能的原因。

  • 首先,最重要的是,我没有看到您的编译器和/或标准库支持C99的证据,因此没有证据表明您的编译器和/或标准库支持long long int以及相应的格式说明符{{1} }。
  • 其次,你是%lldprintf的类型撒谎; a告诉%d该参数的类型为printf,即使它不是(int)。您应该使用long long int ...

从技术上讲,这两种方法都会调用未定义的行为;当您的参数不是%lld时使用%d是UB,即使您正确使用int,您也会在C89的%lld中使用无效的格式说明符( scanf是C99格式说明符)并因此调用UB。

您是否考虑过使用Clang in Visual Studio