unsigned long long + int

Discussion in 'C Programming' started by Peter Ammon, Sep 28, 2004.

  1. Peter Ammon

    Peter Ammon Guest

    When I add an unsigned long long and an int, what type do each of the
    values get promoted to before the addition is performed? What is the
    type of the resulting expression? What occurs if the addition overflows
    or underflows?

    Thanks,

    -Peter
     
    Peter Ammon, Sep 28, 2004
    #1
    1. Advertisements

  2. Peter Ammon

    Mike Wahler Guest

    The 'unsigned long long' object is not promoted at all.
    The 'int' object is promoted to 'unsigned long long'.
    'unsigned long long'
    Undefined.

    -Mike
     
    Mike Wahler, Sep 29, 2004
    #2
    1. Advertisements

  3. Peter Ammon

    Mike Wahler Guest

    Sorry, this is not correct. Upon overflow, unsigned integer
    types will 'wrap' to zero. The undefined behavior occurs with
    signed integer types.

    -Mike
     
    Mike Wahler, Sep 29, 2004
    #3
  4. Peter Ammon

    Peter Ammon Guest

    Thanks! How does this promotion occur? Is it guaranteed to convert the
    value modulo ULLONG_MAX + 1 (like I hope), or is it an implementation
    defined thing?

    [...]

    -Peter
     
    Peter Ammon, Sep 29, 2004
    #4
  5. Peter Ammon

    kal Guest

    Try it on your machine/compiler and let us know.

    On of these days I am going to figure out what the following means.

    6.3.1.8 Usual arithmetic conversions

    1 Many operators that expect operands of arithmetic type cause
    conversions and yield result types in a similar way. The purpose
    is to determine a common real type for the operands and result.
    For the specified operands, each operand is converted, without
    change of type domain, to a type whose corresponding real type
    is the common real type. Unless explicitly stated otherwise, the
    common real type is also the corresponding real type of the result,
    whose type domain is the type domain of the operands if they are
    the same, and complex otherwise. This pattern is called the usual
    arithmetic conversions:

    First, if the corresponding real type of either operand is long
    double, the other operand is converted, without change of type
    domain, to a type whose corresponding real type is long double.

    Otherwise, if the corresponding real type of either operand is
    double, the other operand is converted, without change of type
    domain, to a type whose corresponding real type is double.

    Otherwise, if the corresponding real type of either operand is
    float, the other operand is converted, without change of type
    domain, to a type whose corresponding real type is float.

    Otherwise, the integer promotions are performed on both operands.
    Then the following rules are applied to the promoted operands:

    If both operands have the same type, then no further
    conversion is needed.

    Otherwise, if both operands have signed integer types or
    both have unsigned integer types, the operand with the type
    of lesser integer conversion rank is converted to the type
    of the operand with greater rank.

    Otherwise, if the operand that has unsigned integer type has
    rank greater or equal to the rank of the type of the other
    operand, then the operand with signed integer type is
    converted to the type of the operand with unsigned integer
    type.

    Otherwise, if the type of the operand with signed integer
    type can represent all of the values of the type of the
    operand with unsigned integer type, then the operand with
    unsigned integer type is converted to the type of the
    operand with signed integer type.

    Otherwise, both operands are converted to the unsigned
    integer type corresponding to the type of the operand
    with signed integer type.
     
    kal, Sep 29, 2004
    #5
  6. Peter Ammon

    CBFalconer Guest

    Yes, guaranteed.
     
    CBFalconer, Sep 29, 2004
    #6
  7. Peter Ammon

    S.Tobias Guest

    ^^^^^^^^ -> converted
     
    S.Tobias, Sep 29, 2004
    #7
  8. Peter Ammon

    kal Guest

    Seems so. But I still can't figure out what the standard says.

    Say, while converting from long to unsigned long where the value
    of long is negative, does this mean the value of unsigned long
    is calculated as ULONG_MAX + 1 + <value of long> ?

    6.3.1.3 Signed and unsigned integers

    2 Otherwise, if the new type is unsigned, the value is converted
    by repeatedly adding or subtracting one more than the maximum
    value that can be represented in the new type until the value
    is in the range of the new type.
     
    kal, Sep 29, 2004
    #8
  9. Peter Ammon

    CBFalconer Guest

    In most cases it means modulo arithmetic. The verbiage is
    necessary to cater to the various allowable integral arithmetic
    forms, 2s complement, 1s complement, sign-magnitude.
     
    CBFalconer, Sep 29, 2004
    #9
  10. Peter Ammon

    Joe Wright Guest

    Objects are not converted, values are. Conversion to higher rank is
    called promotion. Like in the Army. :=)
     
    Joe Wright, Oct 1, 2004
    #10
  11. Peter Ammon

    S.Tobias Guest

    Are you sure (about integer promotions, not the Army :) )?
    I thought the word "promotions" was reserved only for _automatic_
    conversions (rank_less_than_int)->(int); or (float)->(double)
    in argument promotions.
     
    S.Tobias, Oct 2, 2004
    #11
  12. Peter Ammon

    Dan Pop Guest

    Entirely gratuitous nit picking: the purpose of objects is to hold values.
    Chapter and verse.
    In C, there are four strictly delimited categories of automatic
    conversions: the integral promotions, the default argument promotions,
    the usual arithmetic conversions and the assignment operator conversions.
    To avoid misunderstanding, use the word "promotion" only in one of the
    two contexts where the standard uses it, even if the usual arithmetic
    conversions are often army-like promotions...

    Dan
     
    Dan Pop, Oct 4, 2004
    #12
  13. Peter Ammon

    Joe Wright Guest

    What got my attention first was Stan's need to correct Mike's use of
    'promoted' to 'converted'. That was gratuitous I think. Then, in
    context I see Mike promoting objects. That is simply wrong and that
    'the purpose of objects is to hold values' does not change the fact
    that objects are not converted or promoted. Values are.

    I do appreciate your advice. Thank you.
     
    Joe Wright, Oct 4, 2004
    #13
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.