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

strtoull(“-1”,NULL,0)的值应该是多少?

  •  1
  • chqrlie  · 技术社区  · 7 年前

    strtoull("-1", NULL, 0) 评估为 18446744073709551615 , ( 0xFFFFFFFFFFFFFFFF ULLONG_MAX

    自从 strtoull 0 所有的负值?

    周围的行为 -ULLONG_MAX

    strtoul("-18446744073709551615", NULL, 0) -> 1, errno=0
    strtoul("-18446744073709551616", NULL, 0) -> 18446744073709551615, errno=34
    
    1 回复  |  直到 7 年前
        1
  •  9
  •   Florian Weimer    7 年前

    C节标准(C99第7.20.1.4节,C11第7.22.1.4节,两者均为第5段)的普遍解释是,转换在第一步进行,不考虑减号,产生无符号结果。然后这个结果被否定。这是由

    在标准文本中。 Negating values of unsigned type is well-defined

    unsigned long long int 值,转换的第一步不能产生可表示的值,并且第8段适用于:

    如果正确的值超出了可表示值的范围,[] ULLONG_MAX ERANGE 存储在 errno .

    同样,几乎所有实现者对标准的解释都是这样的:可表示值检查仅适用于第一个转换步骤,从输入字符串中的任意精度非负整数到无符号类型。