What does that operation mean?

Discussion in 'C Programming' started by Al, Sep 26, 2006.

  1. Al

    Al Guest

    Hi,
    can anyone tell me what the following means? x is a float, and j an
    integer. What value is in j afterwards?

    j=0; j=(int)(x)&512;

    Now if I use 128 instead of 512 what's the difference?

    Thanks,
    Al
     
    Al, Sep 26, 2006
    #1
    1. Advertising

  2. Al

    Chris Dollin Guest

    Al wrote:

    > can anyone tell me what the following means?


    You could try reading your C book, rather than asking
    for help.

    > x is a float, and j an
    > integer. What value is in j afterwards?
    >
    > j=0; j=(int)(x)&512;


    We don't know what float value `x` has, so we don't know what
    int value `(int)(x)` has (this could be written as `(int) x`),
    so we don't know what value `(int) x & 512` has, except that
    it's either 0 or 512, because of the way bitwise-& works.

    There's no point in assigning `0` to `j` and then assigning
    it the other value.

    Don't post incomplete fragments.

    > Now if I use 128 instead of 512 what's the difference?


    The answer's either 0 or 128.

    --
    Chris "all to pieces, bits and pieces" Dollin
    I'm full of sweetness and light. And I'm /keeping/ it.
     
    Chris Dollin, Sep 26, 2006
    #2
    1. Advertising

  3. Al posted:

    > j=(int)(x)&512;



    The value of the expression, "x", is converted to int, and then BitwiseAND'ed
    with the integer value 512.

    --

    Frederick Gotham
     
    Frederick Gotham, Sep 26, 2006
    #3
  4. Al

    Jack Klein Guest

    On Tue, 26 Sep 2006 10:08:25 +0100, Chris Dollin <>
    wrote in comp.lang.c:

    > Al wrote:
    >
    > > can anyone tell me what the following means?

    >
    > You could try reading your C book, rather than asking
    > for help.
    >
    > > x is a float, and j an
    > > integer. What value is in j afterwards?
    > >
    > > j=0; j=(int)(x)&512;

    >
    > We don't know what float value `x` has, so we don't know what
    > int value `(int)(x)` has (this could be written as `(int) x`),
    > so we don't know what value `(int) x & 512` has, except that
    > it's either 0 or 512, because of the way bitwise-& works.


    No, it's undefined, and anything can happen. Accessing the value of
    an uninitialized float produces the undefined behavior. Attempting to
    cast to int and performing a bit-wise and has nothing to do with it,
    the wheels have already fallen off before you get that far.

    > The answer's either 0 or 128.


    There is no answer here, either, since the behavior is still
    undefined.

    --
    Jack Klein
    Home: http://JK-Technology.Com
    FAQs for
    comp.lang.c http://c-faq.com/
    comp.lang.c++ http://www.parashift.com/c -faq-lite/
    alt.comp.lang.learn.c-c++
    http://www.contrib.andrew.cmu.edu/~ajo/docs/FAQ-acllc.html
     
    Jack Klein, Sep 26, 2006
    #4
  5. Al

    Jack Klein Guest

    On Tue, 26 Sep 2006 20:54:15 GMT, Frederick Gotham
    <> wrote in comp.lang.c:

    > Al posted:
    >
    > > j=(int)(x)&512;

    >
    >
    > The value of the expression, "x", is converted to int, and then BitwiseAND'ed
    > with the integer value 512.


    Accessing the uninitialized value of the float x causes undefined
    behavior. What happens after that doesn't matter, at least not here.

    --
    Jack Klein
    Home: http://JK-Technology.Com
    FAQs for
    comp.lang.c http://c-faq.com/
    comp.lang.c++ http://www.parashift.com/c -faq-lite/
    alt.comp.lang.learn.c-c++
    http://www.contrib.andrew.cmu.edu/~ajo/docs/FAQ-acllc.html
     
    Jack Klein, Sep 26, 2006
    #5
  6. Al

    Old Wolf Guest

    Chris Dollin wrote:
    > Al wrote:
    > > x is a float, and j an integer. What value is in j afterwards?
    > > j=0; j=(int)(x)&512;

    >
    > We don't know what float value `x` has, so we don't know what
    > int value `(int)(x)` has (this could be written as `(int) x`),
    > so we don't know what value `(int) x & 512` has, except that
    > it's either 0 or 512, because of the way bitwise-& works.


    If 'x' has a value outside the range of int, then the behaviour
    is undefined. Otherwise it is 0 or 512 :)

    Jack Klein wrote:
    > No, it's undefined, and anything can happen. Accessing the value of
    > an uninitialized float produces the undefined behavior.


    What makes you think x is uninitialized?
     
    Old Wolf, Sep 27, 2006
    #6
  7. Al

    Chris Dollin Guest

    Jack Klein wrote:

    > On Tue, 26 Sep 2006 10:08:25 +0100, Chris Dollin <>
    > wrote in comp.lang.c:
    >
    >> > x is a float, and j an
    >> > integer. What value is in j afterwards?
    >> >
    >> > j=0; j=(int)(x)&512;

    >>
    >> We don't know what float value `x` has, so we don't know what
    >> int value `(int)(x)` has (this could be written as `(int) x`),
    >> so we don't know what value `(int) x & 512` has, except that
    >> it's either 0 or 512, because of the way bitwise-& works.

    >
    > No, it's undefined, and anything can happen. Accessing the value of
    > an uninitialized float produces the undefined behavior.


    Good catch. I was rather assuming that his `x` had been given
    /a/ value somewhere: I should have said so. (I did wonder if
    the irrelevant `j=0;` was a typo for `x=0;`.)

    --
    Chris "`x` marks the nasal demon" Dollin
    RIP John M. Ford (April 10, 1957 -- September 24, 2006)
     
    Chris Dollin, Sep 27, 2006
    #7
  8. In article <>,
    Jack Klein <> wrote:
    >On Tue, 26 Sep 2006 20:54:15 GMT, Frederick Gotham
    ><> wrote in comp.lang.c:
    >
    >> Al posted:
    >>
    >> > j=(int)(x)&512;

    >>
    >>
    >> The value of the expression, "x", is converted to int, and then BitwiseAND'ed
    >> with the integer value 512.

    >
    >Accessing the uninitialized value of the float x causes undefined
    >behavior. What happens after that doesn't matter, at least not here.


    What makes you think that x is uninitialized?

    Just because you can't see it in the posted fragment, doesn't mean you
    can assume that the posted fragment is the entire program. In fact, we
    can be sure that the posted fragment is *not* the entire program, since
    it would not compile as is.
     
    Kenny McCormack, Sep 30, 2006
    #8
    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. david ullua
    Replies:
    13
    Views:
    669
  2. raan
    Replies:
    2
    Views:
    452
  3. Li Ma
    Replies:
    1
    Views:
    2,282
    Roedy Green
    Mar 9, 2009
  4. Buzz Lightyear
    Replies:
    10
    Views:
    1,124
    Alexander Bartolich
    Aug 12, 2009
  5. C Barrington-Leigh
    Replies:
    1
    Views:
    1,209
    Tim Leslie
    Sep 10, 2010
Loading...

Share This Page