Problems with 64bit integer constant



 DEVELOP > c-Plus-Plus > Problems with 64bit integer constant

LINK TO THIS PAGE  


rating :  0   |  0


  Page 1 of 1

1

 
Topic: DEVELOP > c-Plus-Plus
User: "Jeff Gilchrist"
Date: 17 Jan 2005 12:31:02 PM
Object: Problems with 64bit integer constant
I have tried searching the newsgroup along with the GCC site and could
not find what I think is probably a simple solution.
I am using a 64bit unsigned long long integer and can manipulate 64bits
within the variable but I cannot assign a 64bit constant to it.
With my simple test program:
int main()
{
unsigned long long test;
test = 18446744073709551606;
test = 0xFFFFFFFFFFFFFFF6;
}
I get the following errors with gcc v3.3.x and 3.4:
test.cpp:7: warning: this decimal constant is unsigned only in ISO C90
test.cpp:7: error: integer constant is too large for "long" type
test.cpp:8: error: integer constant is too large for "long" type
I have also tried using variations with no success:
test = (unsigned long long)18446744073709551606;
There must be a way to do this, and it is probably just something
simple that I am overlooking. Can anyone help?
Thanks.
.

User: "Victor Bazarov"

Title: Re: Problems with 64bit integer constant 17 Jan 2005 12:45:55 PM
Jeff Gilchrist wrote:

I have tried searching the newsgroup along with the GCC site and could
not find what I think is probably a simple solution.

I am using a 64bit unsigned long long integer and can manipulate 64bits
within the variable but I cannot assign a 64bit constant to it.

With my simple test program:

int main()
{
unsigned long long test;

There is no 'long long' data type in C++. There is in C99. Perhaps you
need to post your question to the C newsgroup (comp.lang.c)?

test = 18446744073709551606;
test = 0xFFFFFFFFFFFFFFF6;
}

I get the following errors with gcc v3.3.x and 3.4:

test.cpp:7: warning: this decimal constant is unsigned only in ISO C90

The constant has a signed type _unless_ it has the U suffix. Try
test = 18446744073709551606U; // for "native" unsigned int
or
test = 18446744073709551606UL; // for "native" unsigned long
The constant is really too big to fit into a signed integer.

test.cpp:7: error: integer constant is too large for "long" type
test.cpp:8: error: integer constant is too large for "long" type


I have also tried using variations with no success:
test = (unsigned long long)18446744073709551606;

There must be a way to do this, and it is probably just something
simple that I am overlooking. Can anyone help?

If your _C++_ compiler natively supports 64-bit numbers, then it would be
under 'unsigned long' type, and not 'unsigned long long'. Otherwise, this
is a wrong forum to ask about it. Try gnu.g++.help.
Victor
.
User: "Jeff Gilchrist"

Title: Re: Problems with 64bit integer constant 17 Jan 2005 01:23:20 PM
Victor Bazarov wrote:

There is no 'long long' data type in C++. There is in C99. Perhaps
you need to post your question to the C newsgroup (comp.lang.c)?

You are right of course. I sometimes forget which things are in the C
standard and which are in the C++ since most C++ compilers treat C code
as a substet of C++ and its hard to tell the difference.
For people with 32bit processors, how does one create a 64bit data type
in C++ if 'int' and 'long' are both treated as 32bit in the
compiler(s)?
Thanks,
Jeff.
.
User: "Victor Bazarov"

Title: Re: Problems with 64bit integer constant 17 Jan 2005 01:38:38 PM
Jeff Gilchrist wrote:

[..]
For people with 32bit processors, how does one create a 64bit data type
in C++ if 'int' and 'long' are both treated as 32bit in the
compiler(s)?

Usually that's achieved by means of some language extensions. E.g., VC++
has '__int64' and 'unsigned __int64' that can be used. Constants of these
types have non-standard suffixes 'i64' and 'ui64'.
V
.
User: "Rolf Magnus"

Title: Re: Problems with 64bit integer constant 17 Jan 2005 03:17:29 PM
Victor Bazarov wrote:

Jeff Gilchrist wrote:

[..]
For people with 32bit processors, how does one create a 64bit data type
in C++ if 'int' and 'long' are both treated as 32bit in the
compiler(s)?


Usually that's achieved by means of some language extensions. E.g., VC++
has '__int64' and 'unsigned __int64' that can be used.

And gcc has 'long long' and 'unsigned long long'.

Constants of these types have non-standard suffixes 'i64' and 'ui64'.

What do you mean by "non-standard suffixes"?
.
User: "Victor Bazarov"

Title: Re: Problems with 64bit integer constant 17 Jan 2005 03:27:07 PM
Rolf Magnus wrote:

Victor Bazarov wrote:


Jeff Gilchrist wrote:

[..]
For people with 32bit processors, how does one create a 64bit data type
in C++ if 'int' and 'long' are both treated as 32bit in the
compiler(s)?


Usually that's achieved by means of some language extensions. E.g., VC++
has '__int64' and 'unsigned __int64' that can be used.



And gcc has 'long long' and 'unsigned long long'.


Constants of these types have non-standard suffixes 'i64' and 'ui64'.



What do you mean by "non-standard suffixes"?

AFAIK, there are no standard suffixes 'i64' and 'ui64'. There are 'L',
'U', 'UL', 'F'. And by "constants" I actually meant "literals". My bad.
.





User: "John Valko"

Title: Re: Problems with 64bit integer constant 17 Jan 2005 12:43:02 PM
Jeff Gilchrist wrote:

test = 18446744073709551606;
test = 0xFFFFFFFFFFFFFFF6;

Add the suffix "LLU" to the constants and it should work for you.
-- John
.
User: "Jeff Gilchrist"

Title: Re: Problems with 64bit integer constant 17 Jan 2005 01:24:21 PM
John Valko wrote:

Add the suffix "LLU" to the constants and it should work for you.

Thanks John, works like a charm.
Much appreciated,
Jeff.
.



  Page 1 of 1

1

 


Related Articles
 

NEWER

pg.1232     pg.940     pg.716     pg.544     pg.412     pg.311     pg.234     pg.175     pg.130     pg.96     pg.70     pg.50     pg.35     pg.24     pg.16     pg.10     pg.6     pg.3     pg.1

OLDER