473,395 Members | 2,443 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,395 software developers and data experts.

Tell me more about 64 bit integers

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
5 2036
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

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
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
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
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 thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

303
by: mike420 | last post by:
In the context of LATEX, some Pythonista asked what the big successes of Lisp were. I think there were at least three *big* successes. a. orbitz.com web site uses Lisp for algorithms, etc. b....
22
by: bearophile | last post by:
Ville Vainio: >It's highly typical for the newbies to suggest improvements to the >language. They will usually learn that they are wrong, but the >discussion that ensues can be fruitfull anyway...
29
by: Chris Dutrow | last post by:
I searched around on the net for a bit, couldn't find anything though. I would like to find some code for a function where I input A Range Of Integers For example: Function( 1, 100 ); And the...
6
by: Markus Dehmann | last post by:
I have n sets of elements. I want to find elements that occur more than once in more than one set. Maybe the following example shows what I mean: S1 = {1,2,3,2,4} S2 = {2,2,4,5,4} S2 =...
5
by: greenflame | last post by:
How can I tell if a variable. I want ot tell whether two variables are: 1. Both numbers. Just a number. same as the number object in javascript. 2. Either one is a string containing a number....
39
by: Antoon Pardon | last post by:
I was wondering how people would feel if the cmp function and the __cmp__ method would be a bit more generalised. The problem now is that the cmp protocol has no way to indicate two objects are...
16
by: aruna | last post by:
Given a set of integers, how to write a program in C to sort these set of integers using C, given the following conditions a. Do not use arrays b. Do not use any comparison function like if/then...
161
by: KraftDiner | last post by:
I was under the assumption that everything in python was a refrence... so if I code this: lst = for i in lst: if i==2: i = 4 print lst I though the contents of lst would be modified.....
8
by: bearophileHUGS | last post by:
sys.maxint gives the largest positive integer supported by Python's regular integer type. But maybe such attribute, with few others (they can be called min and max) can be given to int type itself....
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
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,...
0
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...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
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...

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.