代码之家  ›  专栏  ›  技术社区  ›  lmirosevic

关于将浮点赋给int的简单问题

  •  1
  • lmirosevic  · 技术社区  · 14 年前

    这可能很简单,但我没有得到我期望的结果。我很抱歉,如果这是一个愚蠢的问题,我只是不知道什么谷歌。

    最简单的解释方法是使用一些代码:

    int var = 2.0*4.0;
    
    NSLog(@"%d", 2.0*4.0);//1
    NSLog(@"%d", var);//2
    
    if ((2.0*4.0)!=0) {//3
        NSLog(@"true");
    }
    
    if (var!=0) {//4
        NSLog(@"true");
    }
    

    这将产生以下输出:

    0   //1
    8   //2
    true    //3
    true    //4
    

    我不懂的是台词 //1 . 为什么其他人都把float转换成int(我假设正确的单词是“casting”,如果我错了,请纠正我),但在NSLog中却没有。这和字符串格式有关吗 %d 参数和它是挑剔的(因为没有更好的词)?

    5 回复  |  直到 14 年前
        1
  •  4
  •   Stephen Canon    14 年前

    @"%d" 8.0 ,碰巧)。当你对NSLog撒谎时,它的行为是未定义的,你会得到这样意想不到的结果。

    不要对NSLog撒谎。如果要转换 2.0*4.0

    NSLog(@"%d", (int)(2.0*4.0));
    

    2.0*4.0

    NSLog(@"%g", 2.0*4.0);
    

    更广泛地说,任何函数都是这样的,它需要可变数量的参数和一些格式字符串来告诉它如何解释它们。由您来确定传递给它的数据是否与相应的格式说明符匹配;隐式转换不会发生在您身上。

        2
  •  3
  •   Yuji    14 年前

    首先,你从没用过 float double

    第二,争论 NSLog , printf %d %f . 它遵循非类型化参数的标准提升规则。看到了吗 the ISO specification, sec 6.5.2.2.6 and 6.5.2.2.7 . 请注意,在这些函数中,

    • 浮动 双重的 ,
    • 以及任何小于 int 被提升为 内景 . (见6.3.1.1.2)

    所以,严格来说,规范 没有显示 浮动 ,但是 双重的

    另请注意,在案例1和案例3中,促销是 双重的 .

        3
  •  2
  •   Chuck    14 年前

    printf 函数允许初始格式字符串后面的所有参数为任何类型,因此这是有效的。但是由于编译器不知道您的意思是int(请记住,您没有做任何事情让编译器知道),所以浮点值作为浮点值传递。什么时候? 打印F 看到 %d 格式化说明符,它从参数列表中弹出足够的字节来表示int,并将这些字节解释为int。这些字节恰好看起来像整数0。

        4
  •  0
  •   Joshua Weinberg    14 年前

    格式字符串 %d 需要十进制数,表示以10为基数的整数,而不是浮点数。你想要的是 %f 如果你想把它打印出来 8.0

        5
  •  0
  •   Bill Forster    14 年前

    摘要;确保在第二个(及后续)参数中传递正确类型的变量。