By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
445,820 Members | 1,142 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 445,820 IT Pros & Developers. It's quick & easy.

Tell me more about 64 bit integers

P: n/a
Im trying to learn a little more about C compilers.

Im trying to work with 64 bit numbers (integers) with the gcc compiler
in linux (ubuntu). I need to know how to make use of 64 bit numbers.

My test program as follows:

-----------------------------------------------------------------
#include <ncurses.h>
#define sleep(x) usleep(x * 1000) // adjust sleep functions to
milliseconds
typedef unsigned char byte; // values are 0-255
#define wlen 43 // how many bits long we are
interested in

int Int2Bin(int x, byte *y) {
int i, j;

y += wlen; *y-- = 0; j = 0;
for (i = 0; i < wlen; i++) {
*y-- = 48 + (x & 1);
if (x & 1) j = i + 1;
x >>= 1;
}
return j;
}

int CountOnes(byte *x) {
int i;

i = 0;
do {
i += 1 & (*x++ == 49);
} while (*x != 0);
return i;
}

int main(void) {

static long long Count = 1, t = 0x1FFFFF;
static byte bits[64];

initscr();
noecho();

do {
Int2Bin(t++, bits);
if (CountOnes(bits) == 21) {
printw("%s :: Count = %d\n", bits, Count++);
refresh();
}
} while (t < 0x7FFFFC00000); // error here over long

getch();
endwin();

printf("\nTest program completed successfully.\n\n");
return 0;
}

--------------------------------------------------------

Any help greatly appriciated.
Nov 7 '06 #1
Share this Question
Share on Google+
5 Replies


P: n/a
On Tue, 07 Nov 2006 14:39:43 -0600, Kenneth Lantrip
<bo********@cmaaccess.comwrote in comp.lang.c:
Im trying to learn a little more about C compilers.

Im trying to work with 64 bit numbers (integers) with the gcc compiler
in linux (ubuntu). I need to know how to make use of 64 bit numbers.
Make up your mind, are you trying to learn about 64 bit integers, or
about C compilers?
My test program as follows:

-----------------------------------------------------------------
#include <ncurses.h>
#define sleep(x) usleep(x * 1000) // adjust sleep functions to
milliseconds
typedef unsigned char byte; // values are 0-255
#define wlen 43 // how many bits long we are
interested in

int Int2Bin(int x, byte *y) {
int i, j;

y += wlen; *y-- = 0; j = 0;
for (i = 0; i < wlen; i++) {
*y-- = 48 + (x & 1);
Don't do what you did in the line above. It is both absolutely
horrible and absolutely unnecessary. You have placed a "magic number"
directly in the code. Someone reading this code some day might spend
hours scratching his/her head trying to figure out what the 48 is for.

The number of hours you worked last week? The number of cups of
coffee you drank before lunch? The number of lines on a page? The
number of gray hairs you developed working on this code?

Now I happen to have looked into my crystal ball and divined the fact
that you are using 48 as the numeric code for the ASCII '0' character.
Which means that your code is guaranteed to fail if it is ever ported
to a platform that uses a different character set.

And it's totally unnecessary. All you need to do here is replace 48
with '0'. Then it will work on any platform what a conforming C
compiler now and forever, no matter what character set it uses. And
of course, it tells a reader of your program exactly what is going on,
so he/she won't have to wonder if 48 is the number of pimples on your
butt.
if (x & 1) j = i + 1;
x >>= 1;
}
return j;
}

int CountOnes(byte *x) {
int i;

i = 0;
do {
i += 1 & (*x++ == 49);
Oh, there you are, doing it again. You need to nip down to the local
pharmacy for some ointment, it's spreading, you've added another
pimple on the butt.

'1', not 49!
} while (*x != 0);
return i;
}

int main(void) {

static long long Count = 1, t = 0x1FFFFF;
static byte bits[64];

initscr();
noecho();

do {
Int2Bin(t++, bits);
if (CountOnes(bits) == 21) {
printw("%s :: Count = %d\n", bits, Count++);
refresh();
}
} while (t < 0x7FFFFC00000); // error here over long

getch();
endwin();

printf("\nTest program completed successfully.\n\n");
return 0;
}

--------------------------------------------------------

Any help greatly appriciated.
I can't compile your code, because it uses some non-standard headers
and function calls, so don't keep me in suspense. What exactly is the
error message? When asking about such a message, copy the text and
paste it into your post.

--
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.contrib.andrew.cmu.edu/~a...FAQ-acllc.html
Nov 8 '06 #2

P: n/a

Kenneth Lantrip wrote:
Im trying to learn a little more about C compilers.

Im trying to work with 64 bit numbers (integers) with the gcc compiler
in linux (ubuntu). I need to know how to make use of 64 bit numbers.

My test program as follows:

-----------------------------------------------------------------
#include <ncurses.h>
#define sleep(x) usleep(x * 1000) // adjust sleep functions to
milliseconds
typedef unsigned char byte; // values are 0-255
#define wlen 43 // how many bits long we are
interested in
Please don't use "//" comments - as you can see the news reader has
messed them up, and I'd have to do a lot of repair to be able to cut,
paste and compile your code.

Why use the non-standard curses code (which is Un*x-specified, unless
I'm much mistaken), in a posting to the C group? If you use stdio, we
can (try to) build and test your code on any platform.

....
for (i = 0; i < wlen; i++) {
*y-- = 48 + (x & 1);
As the man said, 48 (and 49) are magic numbers - you should be more
expressive. Equally, why was 43 used for wlen?

....
} while (t < 0x7FFFFC00000); // error here over long
What error?
Could it have been this one ? "nc.c:44: warning: integer constant is
too large for "long" type"

If so, perhaps you need to make the constant a "long long" constant, by
adding "LL"...

Nov 8 '06 #3

P: n/a
Kenneth Lantrip wrote:
>
Im trying to work with 64 bit numbers (integers) with the gcc compiler
in linux (ubuntu). I need to know how to make use of 64 bit numbers.
[...]
} while (t < 0x7FFFFC00000); // error here over long
[...]
Boy, tough crowd. I haven't read this group in a while, and the first
two responses I see are more flame than useful. I don't think I'm
going to stick around here.

Anyway, the problem is that you need to add a suffix to the number to
let it know it isn't a plain (32 bit in this case) integer.
0x7FFFFC00000LL should work with GCC on most common platforms... This
declares a "long long" integer constant. I forget what the suffix
would be under Win32, but since you're using ncurses, I'm guessing
you're working under Linux/Unix.

Cheers.

Nov 9 '06 #4

P: n/a
xs*****@gmail.com wrote:
Kenneth Lantrip wrote:
>Im trying to work with 64 bit numbers (integers) with the gcc
compiler in linux (ubuntu). I need to know how to make use of
64 bit numbers.
> [...]
} while (t < 0x7FFFFC00000); // error here over long
[...]

Boy, tough crowd. I haven't read this group in a while, and the
first two responses I see are more flame than useful. I don't
think I'm going to stick around here.
Not very amenable to constructive criticism, are you?

--
Chuck F (cbfalconer at maineline dot net)
Available for consulting/temporary embedded and systems.
<http://cbfalconer.home.att.net>
Nov 9 '06 #5

P: n/a
xs*****@gmail.com wrote:
Kenneth Lantrip wrote:

>>Im trying to work with 64 bit numbers (integers) with the gcc compiler
in linux (ubuntu). I need to know how to make use of 64 bit numbers.

>[...]
} while (t < 0x7FFFFC00000); // error here over long
[...]


Boy, tough crowd. I haven't read this group in a while, and the first
two responses I see are more flame than useful. I don't think I'm
going to stick around here.

Anyway, the problem is that you need to add a suffix to the number to
let it know it isn't a plain (32 bit in this case) integer.
0x7FFFFC00000LL should work with GCC on most common platforms... This
declares a "long long" integer constant. I forget what the suffix
would be under Win32, but since you're using ncurses, I'm guessing
you're working under Linux/Unix.

Cheers.
Thanks a ton... That is what I needed to know.

To answer some of the other ppls question without posting again... I was
wanting to know how to handle 64 bit numbers as constants (compiler
operation). I realise there are (were) lots of errors in the code I
previously listed.

Here is the completed test run code. I found that it compiles and runs
very nicely on a 64 computer with 64 bit Ubuntu (Linux). This is just
for those curious about what was needed

#include <stdio.h>
typedef unsigned char byte; // values are 0-255
#define wlen 43 // how many bits long we are interested in

int Int2Bin(unsigned long long x, byte *y) {
int i, j;

y += wlen; *y-- = 0; j = 0;
for (i = 0; i < wlen; i++) {
if (x & 1) {*y-- = 49; j++;} else *y-- = 48;
x >>= 1;
}
return j;
}

int main(void) {

static unsigned long long Count = 0;
static unsigned long long t = 0x3FFFFF;
static unsigned long long x = 0;
static byte bits[64];

do {
if (Int2Bin(t++, bits) == 22) {
Count++;
if (t x) {
x = t + 0x40000;
printf("%s :: Count = %d\n", bits, Count);
}
}
} while (t < 0x7FFFFE00000);

printf("\nTest program completed successfully.\n\n");
return 0;
}
Nov 9 '06 #6

This discussion thread is closed

Replies have been disabled for this discussion.