What could the compiler be possibly complaining about

Discussion in 'C Programming' started by parag_paul@hotmail.com, Mar 6, 2008.

  1. Guest

    Are there any compiler groups.
    Though I try it in this language forum
    I got the following message for the following line in a c file

    if (logic_value_change == p_variable_info->vc_reason &&
    p_variable_info->p_value->logic_value <4 &&
    p_variable_info->p_value->logic_value>=0)



    The message is
    .../star186559.c: In function `func_var':
    .../star186559.c:320: warning: comparison is always true due to limited
    range of data type



    comparison is always true ????

    The data type fpr logic_value is a unsigned char
    -Parag
    , Mar 6, 2008
    #1
    1. Advertising

  2. said:

    > Are there any compiler groups.


    Yes, but you don't need one for this question, which is about the C
    language.

    > Though I try it in this language forum
    > I got the following message for the following line in a c file
    >
    > if (logic_value_change == p_variable_info->vc_reason &&
    > p_variable_info->p_value->logic_value <4 &&
    > p_variable_info->p_value->logic_value>=0)
    >
    > The message is
    > ../star186559.c: In function `func_var':
    > ../star186559.c:320: warning: comparison is always true due to limited
    > range of data type
    >
    > comparison is always true ????


    Yes.

    > The data type fpr logic_value is a unsigned char


    An unsigned char cannot hold negative values. It can only hold values in
    the range 0 to UCHAR_MAX, which is guaranteed to be a positive integer
    value that is at least 255 (but is higher on some systems).

    The comparison you have is: p_variable_info->p_value->logic_value>=0

    Now, *any* unsigned char value *must* have a value greater than or equal to
    0, by definition. Therefore, the comparison >= 0 will always yield true
    for an unsigned char, which is exactly what the compiler is (correctly)
    telling you.

    --
    Richard Heathfield <http://www.cpax.org.uk>
    Email: -http://www. +rjh@
    Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
    "Usenet is a strange place" - dmr 29 July 1999
    Richard Heathfield, Mar 6, 2008
    #2
    1. Advertising

  3. wrote:
    > Are there any compiler groups.
    > Though I try it in this language forum
    > I got the following message for the following line in a c file
    >
    > if (logic_value_change == p_variable_info->vc_reason &&
    > p_variable_info->p_value->logic_value <4 &&
    > p_variable_info->p_value->logic_value>=0)


    > The message is
    > .../star186559.c: In function `func_var':
    > .../star186559.c:320: warning: comparison is always true due to limited
    > range of data type


    > comparison is always true ????


    > The data type fpr logic_value is a unsigned char


    The comparison
    p_variable_info->p_value->logic_value>=0)
    is obviously always true if logic_value is an unsigned char.
    An unsigned char cannot be less than zero.
    Martin Ambuhl, Mar 6, 2008
    #3
  4. wrote:
    > Are there any compiler groups.
    > Though I try it in this language forum
    > I got the following message for the following line in a c file
    >
    > if (logic_value_change == p_variable_info->vc_reason &&
    > p_variable_info->p_value->logic_value <4 &&
    > p_variable_info->p_value->logic_value>=0)
    >
    >
    >
    > The message is
    > ../star186559.c: In function `func_var':
    > ../star186559.c:320: warning: comparison is always true due to limited
    > range of data type
    >
    >
    >
    > comparison is always true ????
    >
    > The data type for logic_value is a unsigned char
    > -Parag


    That warning sometimes comes up when you compare variables of different
    sizes. To really know what you need to do differently, I'd need the
    types of all the other variables you are comparing as well.

    To illustrate what is happening here, consider an unsigned char.
    Because it is only eight bytes long and can store values no larger than
    255, if you write something like:

    int function {
    char a = 255;
    if (a < 256) return 1;
    };

    The comparison will always be true and the function will always return 1.

    As a point of practice, it's always a good idea to put parentheses
    around the parts of a condition, eg:

    if ( (logic_value_change == p_variable_info->vc_reason) &&
    (p_variable_info->p_value->logic_value < 4) &&
    (p_variable_info->p_value->logic_value >= 0) )

    However, conveniently, the precedence of ==, <, and >= are all greater
    than that of &&, so that shouldn't be your issue. -> trumps all of
    those. I'm guessing that the issue is as simple as logic_value_change
    and vc_reason having silly types.

    --
    --Falcon Kirtaran
    Falcon Kirtaran, Mar 7, 2008
    #4
  5. Falcon Kirtaran wrote:
    > wrote:
    >> Are there any compiler groups.
    >> Though I try it in this language forum
    >> I got the following message for the following line in a c file
    >>
    >> if (logic_value_change == p_variable_info->vc_reason &&
    >> p_variable_info->p_value->logic_value <4 &&
    >> p_variable_info->p_value->logic_value>=0)
    >>
    >>
    >>
    >> The message is
    >> ../star186559.c: In function `func_var':
    >> ../star186559.c:320: warning: comparison is always true due to limited
    >> range of data type
    >>
    >>
    >>
    >> comparison is always true ????
    >>
    >> The data type for logic_value is a unsigned char
    >> -Parag

    >
    > That warning sometimes comes up when you compare variables of different
    > sizes. To really know what you need to do differently, I'd need the
    > types of all the other variables you are comparing as well.
    >
    > To illustrate what is happening here, consider an unsigned char. Because
    > it is only eight bytes long and can store values no larger than 255, if
    > you write something like:
    >
    > int function {
    > char a = 255;
    > if (a < 256) return 1;
    > };
    >
    > The comparison will always be true and the function will always return 1.
    >
    > As a point of practice, it's always a good idea to put parentheses
    > around the parts of a condition, eg:
    >
    > if ( (logic_value_change == p_variable_info->vc_reason) &&
    > (p_variable_info->p_value->logic_value < 4) &&
    > (p_variable_info->p_value->logic_value >= 0) )
    >
    > However, conveniently, the precedence of ==, <, and >= are all greater
    > than that of &&, so that shouldn't be your issue. -> trumps all of
    > those. I'm guessing that the issue is as simple as logic_value_change
    > and vc_reason having silly types.
    >
    > --
    > --Falcon Kirtaran


    Bah. Clearly, I am a fool. Your problem is "logic_value>=0" because
    unsigned types can't contain negative numbers.
    Falcon Kirtaran, Mar 9, 2008
    #5
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. codehead
    Replies:
    3
    Views:
    392
    codehead
    Jun 13, 2005
  2. Replies:
    2
    Views:
    430
  3. Thomas McLean

    Python complaining about CherryPY?

    Thomas McLean, Aug 19, 2006, in forum: Python
    Replies:
    0
    Views:
    346
    Thomas McLean
    Aug 19, 2006
  4. Replies:
    6
    Views:
    468
  5. ssecorp
    Replies:
    12
    Views:
    659
    Roedy Green
    Jul 9, 2008
Loading...

Share This Page