Bit field issues in Linux


 
Thread Tools Search this Thread
Top Forums Programming Bit field issues in Linux
# 1  
Old 04-07-2006
Bit field issues in Linux

edit: skip this post...the next is a better explaination of my issue.

Last edited by DreamWarrior; 04-07-2006 at 06:37 PM..
# 2  
Old 04-07-2006
OK...so, I did some more tinkering...here's some code and output and I'm very confused by what I'm seeing:

Code:
#include <stdio.h>
#include <stdlib.h>

typedef union
{
	unsigned char	raw;
	
	struct
	{
		unsigned char	high:4;
		unsigned char 	low:4;
	
	} data;
	
} bitwiseStruct;

static void prnBits(void *addr, size_t s);

void main()
{
	int		i;
	bitwiseStruct	bws;
	
	unsigned char	c;
	
	for (i = 0; i < 256; i++)
	{
		bws.raw = (unsigned char) i;
		
		printf("For value %3d:  bits [", (int) bws.raw);
		
		prnBits(&bws.raw, sizeof(char));
		
		c = bws.data.high;
		printf("]; high [");	
		prnBits(&c, sizeof(char));
		
		c = bws.data.low;		
		printf("]; low [");
		prnBits(&c, sizeof(char));
		
		printf("]\n");
	}
}

static void prnBits(void *addr, size_t s)
{
	int	i, j;
	
	unsigned char	*a = (unsigned char *) addr;
	
	for (i = 0; i < s; i++)
	{
		for (j = 7; j >= 0; j--)
		{
			printf("%c", *a & 1 << j ? '1' : '0');
		}

		a++;
	}
}

now, I'd expect this code to work identically on all machines. Why? I was under the impression that the endianess of a machine only affects byte ordering within a word *NOT* bit ordering within a byte. However, on a PA-Risc HP-UX box, for the value 0xF0 (240 decimal, 11110000 binary) I get the following output:

Code:
For value 240:  bits [11110000]; high [00001111]; low [00000000]

While, for my x86 based Linux box I get:

Code:
For value 240:  bits [11110000]; high [00000000]; low [00001111]

WHY?!?! This seems wrong!

edit: I guess it actually doesn't change the bit ordering within the byte. However, the HP compiler is extracting high and low order bits as I'd expect while the Linux compiler is swapping the extraction. Are they allowed to do this?

Last edited by DreamWarrior; 04-07-2006 at 06:37 PM..
# 3  
Old 04-07-2006
OK...I found out that bitfields aren't guarenteed to be packed in any way. Its implementation defined and so I'm screwed Smilie. That sucks too because it'd otherwise be such an elegant solution. I wonder why the specification left it open, if it were guarenteed it'd make doing bit manipulation so much easier than forcing me to manually mask off everything.
Login or Register to Ask a Question

Previous Thread | Next Thread

8 More Discussions You Might Find Interesting

1. Programming

SQL issues comparing Long field to sysdate

I am having hard time with this sql: select partition_name, high_value FROM user_tab_partitions WHERE table_name = 'WNP_TPRESPONSE_INSTANCE' and to_char(high_value) <= to_char(sysdate - 15, 'yyyymm') ; I get an error: ORA-00932: inconsistent datatypes: expected CHAR got LONG... (1 Reply)
Discussion started by: mrn6430
1 Replies

2. High Performance Computing

AVX for Linux (32-bit)

For Intel processors we've a lot of new instruction sets (AVX and AVX2 already exists, AVX512 is announced). Therefore an application has to check during run time which instruction sets are available. I've written for that purpopse some procedures, which are callable from C or C++. A strange... (2 Replies)
Discussion started by: GG2014
2 Replies

3. Windows & DOS: Issues & Discussions

Windows 7 64 bit issues with X11

Hi, I was hoping that somebody could assist me with the following issue. I recently installed a windows 7 64 bit professional on a desktop with following specs: Intel Core i7 3.4Ghz, 16 GB DDR3 RAM, AMD Radeon HD 6450. (Which was a upgrade of a xp 32 bit based system) Since I'm more... (10 Replies)
Discussion started by: kristofvdo
10 Replies

4. UNIX for Advanced & Expert Users

migrating unix mp-ras 32 bit to linux suse 64 bit

Hi. I need to migrate the whole unix environment from a Unix mp-ras 32 bit to a Linux Suse 64 bit. 1) can i use cpio to copy the data? 2) can i just copy the users from unix to linux or do i have to create them by hand 3) are there any other concerns i should worry about? thanx (1 Reply)
Discussion started by: mrodrig
1 Replies

5. Red Hat

32bit Linux vs 64 bit Linux

Friends , Would u plz tell me what is the difference between 32-bit Linux o/s and the 64 bit Linux o/s . Is there any RAM limitation in this two types of o/s . Waiting for kind reply ... ... (7 Replies)
Discussion started by: shipon_97
7 Replies

6. Red Hat

Installing orca in Linux 5.2 64 bit

Hello All, We have a new project in place that calls for RHEL 5.2 64 bit version. This is our first 5.2 as well as 64 bit exposure. On our other Solaris and RHEL 4 systems we used a stats gathering software called ORCA. We are running into problems however trying to install it on RHEL 5.2 64... (0 Replies)
Discussion started by: dchitus
0 Replies

7. Red Hat

boot the 32 bit kernel on a 64 bit PPC Linux machine?

Hi all, I'm looking to cover a corner case for an upcoming test cycle. Is there a way to boot a RedHat Advanced Server 4 (update 3) installed on a Power PC machine to use a 32 bit kernel? This would be similar to what is done here -> https://www.unix.com/aix/26204-aix-platform.html I've done... (0 Replies)
Discussion started by: philrau
0 Replies

8. Gentoo

compiling 32 bit application on 64 bit linux(x86_64)

hi all, i have a 64 bit linux machine. $uname -a Linux SVRDELLD30 2.6.9-42.ELsmp #1 SMP Tue Aug 15 10:35:26 BST 2006 x86_64 x86_64 x86_64 GNU/Linux here by default gcc creates 64 bit executable. but for some reason i want to create 32bit executable. first i want to create 32 bit object... (3 Replies)
Discussion started by: uttamhoode
3 Replies
Login or Register to Ask a Question