linux-c-programming.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* union to get parts of integer
@ 2010-12-20 10:40 ratheesh k
  2010-12-20 12:03 ` Reza Hoorfar
  2010-12-20 14:44 ` Michal Nazarewicz
  0 siblings, 2 replies; 6+ messages in thread
From: ratheesh k @ 2010-12-20 10:40 UTC (permalink / raw)
  To: linux-c-programming

typedef struct {
char parts[4];
} node ;

int i=0x12345678

((node *)&i)->parts[0];
((node *)&i)->parts[1];
((node *)&i)->parts[2];
((node *)&i)->parts[3];

Is there any mechanism to split into bytes using the power of union ?

-Ratheesh

^ permalink raw reply	[flat|nested] 6+ messages in thread

* RE: union to get parts of integer
  2010-12-20 10:40 union to get parts of integer ratheesh k
@ 2010-12-20 12:03 ` Reza Hoorfar
  2010-12-20 14:44 ` Michal Nazarewicz
  1 sibling, 0 replies; 6+ messages in thread
From: Reza Hoorfar @ 2010-12-20 12:03 UTC (permalink / raw)
  To: linux-c-programming

union MyUnion{
	int myInt;
	char myChar[sizeof(int)];
};

void main()
{
	MyUnion m;
	m.myInt = 0x01020304;
	printf("value :%d\n",m.myChar[0]); // -> value : 4
	printf("value :%d\n",m.myChar[1]); // -> value : 3
	printf("value :%d\n",m.myChar[2]); // -> value : 2
	printf("value :%d\n",m.myChar[3]); // -> value : 1
}

-----Original Message-----
From: linux-c-programming-owner@vger.kernel.org
[mailto:linux-c-programming-owner@vger.kernel.org] On Behalf Of ratheesh k
Sent: Monday, December 20, 2010 2:10 PM
To: linux-c-programming@vger.kernel.org
Subject: union to get parts of integer

typedef struct {
char parts[4];
} node ;

int i=0x12345678

((node *)&i)->parts[0];
((node *)&i)->parts[1];
((node *)&i)->parts[2];
((node *)&i)->parts[3];

Is there any mechanism to split into bytes using the power of union ?

-Ratheesh
--
To unsubscribe from this list: send the line "unsubscribe
linux-c-programming" in the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: union to get parts of integer
  2010-12-20 10:40 union to get parts of integer ratheesh k
  2010-12-20 12:03 ` Reza Hoorfar
@ 2010-12-20 14:44 ` Michal Nazarewicz
  2010-12-20 15:30   ` Tim Walberg
  1 sibling, 1 reply; 6+ messages in thread
From: Michal Nazarewicz @ 2010-12-20 14:44 UTC (permalink / raw)
  To: ratheesh k; +Cc: linux-c-programming

[-- Attachment #1: Type: text/plain, Size: 807 bytes --]

ratheesh k <ratheesh.ksz@gmail.com> writes:

> typedef struct {
> char parts[4];
> } node ;
>
> int i=0x12345678
>
> ((node *)&i)->parts[0];
> ((node *)&i)->parts[1];
> ((node *)&i)->parts[2];
> ((node *)&i)->parts[3];
>
> Is there any mechanism to split into bytes using the power of union ?

The above should work (assuming of course that sizeof(int) == 4).  The
following should work as well:

((char *)&i)[0].

However, are you sure that you need this?  Don't you need "(i & 255)",
"((i >> 8) & 255)", etc. instead?

-- 
Best regards,                                         _     _
 .o. | Liege of Serenly Enlightened Majesty of      o' \,=./ `o
 ..o | Computer Science,  Michal "mina86" Nazarewicz   (o o)
 ooo +--<mina86-tlen.pl>--<jid:mina86-jabber.org>--ooO--(_)--Ooo--

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: union to get parts of integer
  2010-12-20 14:44 ` Michal Nazarewicz
@ 2010-12-20 15:30   ` Tim Walberg
  2010-12-20 15:40     ` Michal Nazarewicz
  2010-12-21 16:22     ` Glynn Clements
  0 siblings, 2 replies; 6+ messages in thread
From: Tim Walberg @ 2010-12-20 15:30 UTC (permalink / raw)
  To: Michal Nazarewicz; +Cc: ratheesh k, linux-c-programming

It's likely that either the union or direct pointer expressions yield
more efficient code, as they can probably be compiled to direct byte-width
load/store instructions, rather than shifts and logical ands... However,
if the code's not in a critical path for performance, it probably won't
matter. And on some architectures, there may not be byte-width operations,
I guess...



On 12/20/2010 15:44 +0100, Michal Nazarewicz wrote:
>>	
>>	((char *)&i)[0].
>>	
>>	However, are you sure that you need this?  Don't you need "(i & 255)",
>>	"((i >> 8) & 255)", etc. instead?
>>	
>>	-- 
>>	Best regards,                                         _     _
>>	 .o. | Liege of Serenly Enlightened Majesty of      o' \,=./ `o
>>	 ..o | Computer Science,  Michal "mina86" Nazarewicz   (o o)
>>	 ooo +--<mina86-tlen.pl>--<jid:mina86-jabber.org>--ooO--(_)--Ooo--


End of included message



-- 
+----------------------+
| Tim Walberg          |
| 830 Carriage Dr.     |
| Algonquin, IL 60102  |
| twalberg@comcast.net |
+----------------------+

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: union to get parts of integer
  2010-12-20 15:30   ` Tim Walberg
@ 2010-12-20 15:40     ` Michal Nazarewicz
  2010-12-21 16:22     ` Glynn Clements
  1 sibling, 0 replies; 6+ messages in thread
From: Michal Nazarewicz @ 2010-12-20 15:40 UTC (permalink / raw)
  To: Tim Walberg; +Cc: ratheesh k, linux-c-programming

Tim Walberg <twalberg@comcast.net> writes:
> It's likely that either the union or direct pointer expressions yield
> more efficient code, as they can probably be compiled to direct byte-width
> load/store instructions, rather than shifts and logical ands... However,
> if the code's not in a critical path for performance, it probably won't
> matter. And on some architectures, there may not be byte-width operations,
> I guess...

It's not the issue of performance.  It's an issue of whether you want
each separate byte as saved in memory (which should rarely be the case)
or if you want specific part of the value.

> On 12/20/2010 15:44 +0100, Michal Nazarewicz wrote:
>>>	
>>>	((char *)&i)[0].
>>>	
>>>	However, are you sure that you need this?  Don't you need "(i & 255)",
>>>	"((i >> 8) & 255)", etc. instead?
>>>	
>>>	-- 
>>>	Best regards,                                         _     _
>>>	 .o. | Liege of Serenly Enlightened Majesty of      o' \,=./ `o
>>>	 ..o | Computer Science,  Michal "mina86" Nazarewicz   (o o)
>>>	 ooo +--<mina86-tlen.pl>--<jid:mina86-jabber.org>--ooO--(_)--Ooo--

-- 
Best regards,                                         _     _
 .o. | Liege of Serenly Enlightened Majesty of      o' \,=./ `o
 ..o | Computer Science,  Michal "mina86" Nazarewicz   (o o)
 ooo +--<mina86-tlen.pl>--<jid:mina86-jabber.org>--ooO--(_)--Ooo--

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: union to get parts of integer
  2010-12-20 15:30   ` Tim Walberg
  2010-12-20 15:40     ` Michal Nazarewicz
@ 2010-12-21 16:22     ` Glynn Clements
  1 sibling, 0 replies; 6+ messages in thread
From: Glynn Clements @ 2010-12-21 16:22 UTC (permalink / raw)
  To: Tim Walberg; +Cc: Michal Nazarewicz, ratheesh k, linux-c-programming


Tim Walberg wrote:

> >>	((char *)&i)[0].
> >>	
> >>	However, are you sure that you need this?  Don't you need "(i & 255)",
> >>	"((i >> 8) & 255)", etc. instead?
> 
> It's likely that either the union or direct pointer expressions yield
> more efficient code, as they can probably be compiled to direct byte-width
> load/store instructions, rather than shifts and logical ands... However,
> if the code's not in a critical path for performance, it probably won't
> matter. And on some architectures, there may not be byte-width operations,
> I guess...

The cast/union versions will give different results depending upon the
CPU's byte order. The shift/mask versions will give the same results
regardless of byte order.

-- 
Glynn Clements <glynn@gclements.plus.com>

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2010-12-21 16:22 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-20 10:40 union to get parts of integer ratheesh k
2010-12-20 12:03 ` Reza Hoorfar
2010-12-20 14:44 ` Michal Nazarewicz
2010-12-20 15:30   ` Tim Walberg
2010-12-20 15:40     ` Michal Nazarewicz
2010-12-21 16:22     ` Glynn Clements

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).