473,387 Members | 1,650 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,387 software developers and data experts.

y >> (8 * (sizeof(int) -1))


Is y >(8 * (sizeof(int) -1)) portable expression to find The MSB of
an unsigned integer y ??

will this work in all the cases, all three of the representations C
allows:

1) two's complement
2) ones'complement
3) signed magnitude.
Jun 27 '08 #1
12 3607
aa*****@gmail.com wrote:
Is y >(8 * (sizeof(int) -1)) portable expression to find The MSB of
an unsigned integer y ??
Probably better and more portable:
#include <limits.h>
....
y >(CHAR_BIT * (sizeof y -1))
will this work in all the cases, all three of the representations C
allows:

1) two's complement
2) ones'complement
3) signed magnitude.
Bye, Jojo
Jun 27 '08 #2
On Tue, 15 Apr 2008 09:47:15 -0700, aarklon wrote:
Is y >(8 * (sizeof(int) -1)) portable expression to find The MSB of
an unsigned integer y ??
No, it isn't.
will this work in all the cases, all three of the representations C
allows:

1) two's complement
2) ones'complement
3) signed magnitude.
These differ in how negative values are represented. Why do you think
negative values matter, given that you've got an unsigned integer?
Jun 27 '08 #3
aark...@gmail.com wrote:
Is y >(8 * (sizeof(int) -1)) portable expression to find The MSB of
an unsigned integer y ??
Define MSB in the following case...

CHAR_BIT = 8
UINT_MAX = 262143

If you want the top CHAR_BIT bits from an unsigned int y, use...

y / ((UINT_MAX >(CHAR_BIT - 1) >1) + 1)
will this work in all the cases, all three of the representations C
allows:

1) two's complement
2) ones'complement
3) signed magnitude.
Unsigned integers use pure binary representation.

--
Peter
Jun 27 '08 #4
On Tue, 15 Apr 2008 09:47:15 -0700 (PDT), aa*****@gmail.com wrote in
comp.lang.c:
>
Is y >(8 * (sizeof(int) -1)) portable expression to find The MSB of
an unsigned integer y ??
It is absolutely not portable, even if you change 8 to CHAR_BIT.

I do a lot of work on a DSP where sizeof(char), sizeof(short), and
sizeof(int) are all 1. CHAR_BIT happens to be 16, of course, and
sizeof(long) is 2, sizeof(long long) is 4.

So on this implementation, either of the expressions:

(8 * (1 - 1))

....or:

(16 * (1 - 1))

....will not tell you anything about the MSB.
will this work in all the cases, all three of the representations C
allows:

1) two's complement
2) ones'complement
3) signed magnitude.
As others have stated, the representation of the signed int types in a
C implementation has nothing to do with the unsigned types.

Try this:

#include <limits.h>

#define UINT_MSB_MASK (UINT_MAX - (UINT_MAX >1))

if (some_unsigned_int & UINT_MSB_MASK)
/* do stuff because it is set */
else
/* do stuff because it is not set */

--
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.club.cc.cmu.edu/~ajo/docs/FAQ-acllc.html
Jun 27 '08 #5
On Apr 15, 9:56 pm, Harald van D©¦k <true...@gmail.comwrote:
On Tue, 15 Apr 2008 09:47:15 -0700,aarklonwrote:
Is y >(8 * (sizeof(int) -1)) portable expression to find The MSB of
an unsigned integer y ??

No, it isn't.
will this work in all the cases, all three of the representations C
allows:
1) two's complement
2) ones'complement
3) signed magnitude.

These differ in how negative values are represented. Why do you think
negative values matter, given that you've got an unsigned integer?

what about finding the MSB of a signed integer ?
Jun 27 '08 #6
aa*****@gmail.com wrote, On 16/04/08 18:00:

<snip>
what about finding the MSB of a signed integer ?
You cannot find that by shifting since right shifting a negative value
gives an implementation defined result and left shifting a 1 in to the
MSB invokes undefined behaviour. If you want to know the sign and don't
care about negative zero then just use either <0 or >=0 as appropriate.
--
Flash Gordon
Jun 27 '08 #7
On 16 Apr, 03:08, Jack Klein <jackkl...@spamcop.netwrote:
On Tue, 15 Apr 2008 09:47:15 -0700 (PDT), aark...@gmail.com wrote in
comp.lang.c:
Is *y >(8 * (sizeof(int) -1)) portable expression to find TheMSBof
an unsigned integer y ??

It is absolutely notportable, even if you change 8 to CHAR_BIT.
<S N I P>
Try this:

#include <limits.h>

#define UINT_MSB_MASK * (UINT_MAX - (UINT_MAX >1))

if (some_unsigned_int & UINT_MSB_MASK)
* */* do stuff because it is set */
else
* */* do stuff because it is not set */
I think he got the parentheses wrong.
y >(CHAR_BIT * sizeof(int) - 1)
where the expression will be 1 if and only
if the MSB of y is set , seems fine to me.

But your solution looks neater and is likely
faster.
Jun 27 '08 #8
On 16 Apr, 20:18, Flash Gordon <s...@flash-gordon.me.ukwrote:
aark...@gmail.com wrote, On 16/04/08 18:00:

<snip>
what about finding the MSB of a signed integer ?

You cannot find that by shifting since right shifting a negative value
gives an implementation defined result and left shifting a 1 in to the
MSB invokes undefined behaviour. If you want to know the sign and don't
care about negative zero then just use either <0 or >=0 as appropriate.
I think that by "MSB of a signed integer" he means
the bit which contributes the most to the magnitude
of the value rather than the sign bit.

I believe that a variation of Jack Klein's solution
for unsigned integers will also work in this case:

#include <limits.h>

#define INT_MSB_MASK (INT_MAX - (INT_MAX >1))

if (#include <limits.h>
#define UINT_MSB_MASK (UINT_MAX - (UINT_MAX >1))

if (some_unsigned_int == 0)
/* do stuff because it is not set */
else if (some_signed_int & INT_MSB_MASK)
/* do stuff because it is set */
else
/* do stuff because it is not set */
Jun 27 '08 #9

On a minority of systems, there's padding bits within integer types,
and so sizeof(integer type) won't give you the amount of value
representational bits.
Jun 27 '08 #10
On 19 Apr, 15:49, Spiros Bousbouras <spi...@gmail.comwrote:
On 16 Apr, 20:18, Flash Gordon <s...@flash-gordon.me.ukwrote:
aark...@gmail.com wrote, On 16/04/08 18:00:
<snip>
what about finding the MSB of a signed integer ?
You cannot find that by shifting since right shifting a negative value
gives an implementation defined result and left shifting a 1 in to the
MSB invokes undefined behaviour. If you want to know the sign and don't
care about negative zero then just use either <0 or >=0 as appropriate..

I think that by "MSB of a signed integer" he means
the bit which contributes the most to the magnitude
of the value rather than the sign bit.

I believe that a variation of Jack Klein's solution
for unsigned integers will also work in this case:

#include <limits.h>

#define INT_MSB_MASK * (INT_MAX - (INT_MAX >1))

if (#include <limits.h>

#define UINT_MSB_MASK * (UINT_MAX - (UINT_MAX >1))

if (some_unsigned_int == 0)
* */* do stuff because it is not set */
else if (some_signed_int & INT_MSB_MASK)
* */* do stuff because it is set */
else
* */* do stuff because it is not set */
I bungled up my post above. The correct version is

#include <limits.h>

#define INT_MSB_MASK (INT_MAX - (INT_MAX >1))

if (some_signed_int == 0)
/* do stuff because it is not set */
else if (some_signed_int & INT_MSB_MASK)
/* do stuff because it is set */
else
/* do stuff because it is not set */

The above treats specially the value 0 in that even if it is
negative zero in an one's complement representation it still
considers the bit not to be set.
Jun 27 '08 #11
On 19 Apr, 17:14, Tomás Ó hÉilidhe <t...@lavabit.comwrote:
On a minority of systems, there's padding bits within integer types,
and so sizeof(integer type) won't give you the amount of value
representational bits.
Therefore the expression y >(CHAR_BIT * sizeof(int) - 1) is not
a portable way to check if the MSB is set after all. If there is
even one padding bit the expression will always yield 0 regardless
of whether the MSB is set or not.
Jun 27 '08 #12
On Tue, 22 Apr 2008 10:45:41 -0700, Spiros Bousbouras wrote:
On 19 Apr, 17:14, Tomás Ó hÉilidhe <t...@lavabit.comwrote:
>On a minority of systems, there's padding bits within integer types,
and so sizeof(integer type) won't give you the amount of value
representational bits.

Therefore the expression y >(CHAR_BIT * sizeof(int) - 1) is not a
portable way to check if the MSB is set after all. If there is even one
padding bit the expression will always yield 0 regardless of whether the
MSB is set or not.
If there is any padding, (CHAR_BIT * sizeof(int) - 1) will be greater
than or equal to the width of unsigned int, meaning the behaviour is
undefined if you right-shift by that amount. The expression won't
necessarily evaluate to 0.
Jun 27 '08 #13

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

39
by: Timex | last post by:
I want to delete all comments in .c file. Size of .c file is very big. Any good idea to do this? Please show me example code.
1
by: bidkumar | last post by:
hi friends, code to identify the storage size of the programming elements...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.