Example Code Was : Re: Re : Re: printk and long long

From: wdebruij
Date: Wed Feb 11 2004 - 09:58:56 EST


>
> Well I had tried it but I got
> the follwing compilation errors while trying to add that code:
> invalid operands to binary >>
> invalid operands to binary <<

I just ran the following on my computer :

"
#define LLHIGH(n) (unsigned long) (n >> (8 * sizeof(long)))
#define LLLOW(n) (unsigned long) ((n << (8 * sizeof(long))) >> (8 * sizeof(long)))
/** internal function: called from the template module's init function */
int myfunc(void){

unsigned long long int ullint = ((unsigned long long int) 1 << 32) - 1; //
LONG_MAX returns 7fffffff, this at least is a max_long
unsigned long int ulint = ((unsigned long long int) 1 << 32) - 1;
printk("a long long consists of %d bits on an x86 (athlon-xp), whereas a long
consists of %d bits\n", sizeof(ullint) * 8, sizeof(long) * 8);
printk("my test long long reads %.8lx%.8lx; my test long %.8lx\n",
LLHIGH(ullint), LLLOW(ullint), ulint );
ullint += 1; // will we get overflow or is a long long really > long?
ulint += 1;
printk("my test long long now reads %.8lx%.8lx; my test long %.8lx\n",
LLHIGH(ullint), LLLOW(ullint), ulint );

"

"
a long long consists of 64 bits on an x86 (athlon-xp), whereas a long consists
of 32 bits
my test long reads 00000000ffffffff; my test long ffffffff
my test long reads 0000000100000000; my test long 00000000
"

It took a bit longer to get right than I imagined (doesn't it always ;), but at
least here you've got a working example. Enjoy.

cheers,

Willem
>
> I assume maybe it is a problems with the flags I use:
> I use gcc 3.2.2 and the flags are:
> O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common
> -DMODULE -D__KERNEL__ -DNOKERNEL

to the best of my knowledge it has nothing to do with this.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/