445,820 Members | 1,142 Online
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 #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 Replies

 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 #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 gcccompiler in linux (ubuntu). I need to know how to make use of64 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. 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 compilerin 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 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.