473,748 Members | 9,913 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Shift Operation

Hi All,

Could you please explain whether C standard supports logical right
shift operation using some operator?

I know somewhere I read about >>operator. I thought, it is in C but i
think i'm wrong about it. No where google helps me determining this
lapse in my memory. MSVC 6 compiler gives me error.

Thanks && Regards,
Nishu

Oct 9 '06 #1
24 3180
Nishu said:
Hi All,

Could you please explain whether C standard supports logical right
shift operation using some operator?
C's right shift operator, >>, works like this:

A >B will yield a result that is equivalent to A shifted right through B
bit positions. If A is negative, the result is implementation-defined.

There is also a >>= operator, of course, so that you can do A >>= B instead
of A = A >B
I know somewhere I read about >>operator. I thought, it is in C
No, 'fraid not.
--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: rjh at above domain (but drop the www, obviously)
Oct 9 '06 #2

Richard Heathfield wrote:
Nishu said:
Hi All,

Could you please explain whether C standard supports logical right
shift operation using some operator?

C's right shift operator, >>, works like this:

A >B will yield a result that is equivalent to A shifted right through B
bit positions. If A is negative, the result is implementation-defined.
If i take a signed integer, so right shifting a negative int should
give me another negative int (signed arithmetic) or a positive integer.
Is this C standard defines or implementation defines?

Actually i want to know whether
long A;
A = 0xFFFFFFFF;

A >>= 1;

A &= 0x80000000

if(A)
{
printf("operato r is arithmetic right shift");
}
else
{
printf(" operator is logical right shift");
}
Thanks.
Nishu

Oct 9 '06 #3
"Nishu" <na**********@g mail.comwrote:
Could you please explain whether C standard supports logical right
shift operation using some operator?
No. Or rather, not reliably.

Right shifting on unsigned integers is, of course, neither logical nor
arithmetical (or both, if you wish); zeros get shifted in from the high
end, but there is no sign bit to copy or not to copy.

Right shifting on signed integers is different for positive and negative
signed integers.
If the signed integer has a positive or zero value, zero bits are
shifted in from the high end just as for unsigned types; it makes no
difference whether this is because it is a logical shift, or whether
it's an arithmetical shift with a zero sign bit being copied. A zero bit
is, after all, equal to any other zero bit.
If, however, the signed integer has a negative value, the resulting
value is implementation-defined. This means that your program is not
allowed to crash on this operation[1], but the Standard doesn't require
any particular result. All it requires is that your implementation
defines what the result will be. This could be a logical shift, an
arithmetical shift, or something entirely different (which might makes
sense on, e.g., one's-complement machines).

So in short, _your compiler_ might use a logical right shift if you use
the normal C >shifting operator, but that assumption is not portable:
there's no guarantee that this will work on the next platform you try it
on.
I know somewhere I read about >>operator. I thought, it is in C but i
think i'm wrong about it.
There is indeed no such thing.

Richard

[1] Unlike _left_-shifting a signed integer where the result would
overflow; that is undefined, and may therefore crash.
Oct 9 '06 #4
In article <11************ *********@k70g2 000cwa.googlegr oups.com>,
Nishu <na**********@g mail.comwrote:
>If i take a signed integer, so right shifting a negative int should
give me another negative int (signed arithmetic) or a positive integer.
Is this C standard defines or implementation defines?
Implementation. Except that those aren't the only two choices
available to the implementation. ..
>Actually i want to know whether
>long A;
A = 0xFFFFFFFF;
>A >>= 1;
>A &= 0x80000000
>if(A)
{
printf("operat or is arithmetic right shift");
}
else
{
printf(" operator is logical right shift");
}
You are presuming that A = 0xFFFFFFFF will store a negative number
in A. That is a bad assumption:

1) long might have more than 32 bits, in which case 0xFFFFFFFF
would just be a regular signed number. It is not uncommon for long
to be 64 bits with int being 32 bits, short 16 bits, char 8 bits.
But it is also not uncommon for int and long both to be the same size
of 32 bits; there are also a number of compilers for which
long is 32 bits, int is 16 bits...

2) 0xFFFFFFFF is not specifically indicated as a long constant via an 'L'
suffix; interpretation of it starts out by considering it as a
signed int. No negative sign is present in the number, so the
compiler will inspect to determine whether 0xFFFFFFFF fits within
the positive range of signed int on that system; if it does then
0xFFFFFFFF would be considered a positive signed int and there would
then be an implicit cast of that positive signed int into a long for
storage into A; as long is promised to be at least as wide as int,
that would either involve leaving the number unchanged or else
widening it if necessary; widening on most systems would involve
sticking the value in the low bits and zero-filling the upper bits,
but int and long need not have the same internal padding bit structures
so an actual representation change might take place.

If the compiler determines that 0xFFFFFFFF does not fit within
the positive range of signed int, then it would reconsider it as
potentialy being a positive signed long; if it does not fit within
a positive signed long, then it would convert it to unsigned long, which
it should fit into. So you would now have an unsigned long constant
token and you would have a simple long destination to store it into.
The C standard says that if you attempt to store an unsigned
value into a signed location, and the unsigned value fits within
the positive range of the signed type, then the positive value
will be stored -- but it also says that if the unsigned value does
*not* fit within the positive range of the signed type, that the
result of the conversion is up to the implementation. Thus,
long A = 0xFFFFFFFF is not necessarily going to produce a negative
result in A, even if the implementation happens to use 32 bit long.
--
I was very young in those days, but I was also rather dim.
-- Christopher Priest
Oct 9 '06 #5
Nishu said:
Richard Heathfield wrote:
<snip>
>If A is negative, the result is implementation-defined.

If i take a signed integer, so right shifting a negative int should
give me another negative int (signed arithmetic) or a positive integer.
Is this C standard defines or implementation defines?
If A is negative, the result is implementation-defined.
Actually i want to know whether
long A;
A = 0xFFFFFFFF;

A >>= 1;

A &= 0x80000000

if(A)
{
printf("operato r is arithmetic right shift");
}
else
{
printf(" operator is logical right shift");
}
If A is negative, the result is implementation-defined.

--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: rjh at above domain (but drop the www, obviously)
Oct 9 '06 #6

Walter Roberson wrote:
In article <11************ *********@k70g2 000cwa.googlegr oups.com>,
Nishu <na**********@g mail.comwrote:
If i take a signed integer, so right shifting a negative int should
give me another negative int (signed arithmetic) or a positive integer.
Is this C standard defines or implementation defines?

Implementation. Except that those aren't the only two choices
available to the implementation. ..
< snip>
The C standard says that if you attempt to store an unsigned
value into a signed location, and the unsigned value fits within
the positive range of the signed type, then the positive value
will be stored -- but it also says that if the unsigned value does
*not* fit within the positive range of the signed type, that the
result of the conversion is up to the implementation. Thus,
long A = 0xFFFFFFFF is not necessarily going to produce a negative
result in A, even if the implementation happens to use 32 bit long.
Thanks. I got it. C is indeed very flexible and benevolent to
compilers. :)

-Nishu

Oct 9 '06 #7

Nishu wrote:

I know somewhere I read about >>operator. I thought, it is in C but i
think i'm wrong about it.
>>(unsigned right shift) exists in Java <http://java.sun.com/docs/books/jls/third_edition/html/expressions.htm l#15.19>, but not in standard C.
Oct 9 '06 #8
Nishu posted:
I know somewhere I read about >>operator.

Maybe you could write one yourself? If you know that "unsigned int" and
"signed int" have no padding, then you could simply do:

int i = -57;

*(unsigned*)&i >>= 4;

Or maybe something like:

i < 0 ? (i = -i) >>= 4, i = -i : i >>= 4

--

Frederick Gotham
Oct 9 '06 #9
Frederick Gotham wrote:
Nishu posted:
>I know somewhere I read about >>operator.
Where >>is meant to be a logical shift right.
Maybe you could write one yourself? If you know that "unsigned int" and
"signed int" have no padding, then you could simply do:

int i = -57;

*(unsigned*)&i >>= 4;
Given your limitations I believe this would work.
Or maybe something like:

i < 0 ? (i = -i) >>= 4, i = -i : i >>= 4
This one will overflow with INT_MIN if INT_MIN == -INT_MAX - 1, i.e. on
most 2s complement machines.
--
Flash Gordon
Oct 9 '06 #10

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

Similar topics

388
21779
by: maniac | last post by:
Hey guys, I'm new here, just a simple question. I'm learning to Program in C, and I was recommended a book called, "Mastering C Pointers", just asking if any of you have read it, and if it's worth the $25USD. I'm just looking for a book on Pointers, because from what I've read it's one of the toughest topics to understand. thanks in advanced.
43
26519
by: Mehta Shailendrakumar | last post by:
Hello, Can anyone suggest me operator to perform arithmetic shift in C? May it be for a perticular compiler. Thank you in advance. Regards, Shailendra
2
5742
by: Matt Sawyer | last post by:
Hi, I'm attempting to do a drag and drop operation from one listbox to another. I have my listboxes setup with SelectionMode = MultiExtended so that I can use the shift key, cntrl key, etc. to make multiple selections. The problem I am having is that when I use the shift key to select a range of items, I first click on one item (item gets highlighted), then, holding down the shift key, I select another item (the range of items gets...
4
4190
by: Felix Kater | last post by:
Hi, when I use something like int Shift= 3; long Value= 1 << Shift; What is the data type of the const value '1' here? In other terms: What is the possible maximum of 'Shift' here?
11
1900
by: Bob Altman | last post by:
Hi all, I want to write a generic class that does this: Public Class X (Of T) Public Sub Method(param As T) dim x as T = param >3 End Sub End Class
0
8826
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 effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
9534
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
9366
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
0
9241
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
0
8239
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
1
6793
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
6073
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
1
3303
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
3
2211
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

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.