The right operand in this case is the result of evaluating the expression.  The 
quoted text is not meant to imply that operands are converted before the right 
hand expression is evaluated.  If that were the case, then 
   int x = 14.0/2.1;
would evaluate to 7 which is demonstrably not the case.

----- Original Message -----
From: "Charles Mills" <charl...@mcn.org>
To: IBM-MAIN@LISTSERV.UA.EDU
Sent: Sunday, July 21, 2013 1:26:54 PM
Subject: Re: Looking for help with an obscure C integer problem

You are 100% correct. You nailed it. Stroustrup p. 263: "If both operands
have arithmetic type, the right operand is converted to the type of the left
preparatory to the assignment."

That explains why it fails, but not why it works Opt(0). I am going to
*guess* that Opt(0) it compiles as though I had coded testWord =
static_cast<unsigned int>(valueToTest >> 32) while with Opt(2) it compiles
as though I had coded testWord = static_cast<unsigned int>(valueToTest) >>
32;

In your earlier post you suggested "wasting" another long long. Yes, that's
an approach. Actually I am finished with valueToTest and can just do things
in two steps without "wasting" a variable:

valueToTest >>= 32;
testWord = valueToTest;

I am busy with other things perhaps until sometime this week but the first
thing I am going to try is simply using parentheses to attempt to "force"
the "Opt(0)" interpretation:

testWord = (valueToTest >> 32);

If that fails I will move on to more elaborate approaches. The "two
statement" approach will either work or else it is a very clear bug and I
will re-group. Will probably try the union approach at that point.

Thanks!

Charles

-----Original Message-----
From: IBM Mainframe Discussion List [mailto:IBM-MAIN@LISTSERV.UA.EDU] On
Behalf Of Bernd Oppolzer
Sent: Sunday, July 21, 2013 9:44 AM
To: IBM-MAIN@LISTSERV.UA.EDU
Subject: Re: Looking for help with an obscure C integer problem

BTW:

I think I remember from an old book on C programming:

"if the target of an assignment is int, all operands on the right side are
converted to int - if the target of an assignment is long, all operands on
the right side are converted to long"

If I remember correctly, this would perfectly explain the behaviour you see
(of course, it makes more sense for data types being shorter than the type
of the assignment target, but if it's done as written above, you have it for
longer types, too).

Kind regards

Bernd




Am 21.07.2013 18:32, schrieb Bernd Oppolzer:
> Sorry for jumping late into this thread.
>
> Why not spend another variable of type long long to do the shift there?
>
> like
>
> unsigned long long valueToTest;
> unsigned int testWord;
> unsigned long long x;
>
> x = valueToTest >> 32;   /* here */
> testWord = (int) x;

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN

Reply via email to