473,386 Members | 1,830 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,386 software developers and data experts.

Why is long long int not as long as promised??

I need a >49 bit integer type. tried sizeof(long long), says 8. 8 byte =
64 bit right? but when I try to assign a value with more than 32 bit,
it fails. To illustrate:

for (i=0; i<64; i++){
long long int k = 1<<i;

cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}
results in

1 2 8
2 4 8
3 8 8
4 16 8
5 32 8
6 64 8
7 128 8
8 256 8
9 512 8
10 1024 8
11 2048 8
12 4096 8
13 8192 8
14 16384 8
15 32768 8
16 65536 8
17 131072 8
18 262144 8
19 524288 8
20 1048576 8
21 2097152 8
22 4194304 8
23 8388608 8
24 16777216 8
25 33554432 8
26 67108864 8
27 134217728 8
28 268435456 8
29 536870912 8
30 1073741824 8
31 -2147483648 8
32 1 8
33 2 8
34 4 8
35 8 8
36 16 8
......

and so on.

I'm beyond confused - can anyone here help me out? Machine is a Core 2
Duo Macbook Pro with OSX10.5, gcc, Xcode.

Thanks

Oliver
Sep 25 '08 #1
15 2708
Oliver Graeser wrote:
I need a >49 bit integer type. tried sizeof(long long), says 8. 8 byte =
64 bit right? but when I try to assign a value with more than 32 bit,
it fails. To illustrate:

for (i=0; i<64; i++){
long long int k = 1<<i;
unsinged long int k = 1<<i; // use this
>
cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}
That happens because you have only half of the numbers for positive, the
other half is used for negatives.

Look here: http://www.cplusplus.com/doc/tutorial/variables.html
Sep 25 '08 #2
Oliver Graeser wrote:
I need a >49 bit integer type. tried sizeof(long long), says 8. 8 byte =
64 bit right? but when I try to assign a value with more than 32 bit,
it fails. To illustrate:

for (i=0; i<64; i++){
long long int k = 1<<i;

cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}
results in

1 2 8
2 4 8
3 8 8
4 16 8
5 32 8
6 64 8
7 128 8
8 256 8
9 512 8
10 1024 8
11 2048 8
12 4096 8
13 8192 8
14 16384 8
15 32768 8
16 65536 8
17 131072 8
18 262144 8
19 524288 8
20 1048576 8
21 2097152 8
22 4194304 8
23 8388608 8
24 16777216 8
25 33554432 8
26 67108864 8
27 134217728 8
28 268435456 8
29 536870912 8
30 1073741824 8
31 -2147483648 8
32 1 8
33 2 8
34 4 8
35 8 8
36 16 8
.....

and so on.

I'm beyond confused - can anyone here help me out? Machine is a Core 2
Duo Macbook Pro with OSX10.5, gcc, Xcode.

Thanks

Oliver
1 is an int, so when you shift it left by more than 32 you wrap around. The
(int) result fits nicely into a 'long long', so the compiler has no reason
to complain. Try this:

const long long int ONE=1L;
for (i=0; i<64; i++){
long long int k = ONE << i;
cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}

--
Al Dunstan, Software Engineer
OptiMetrics, Inc.
3115 Professional Drive
Ann Arbor, MI 48104-5131
Sep 25 '08 #3
On Thu, 25 Sep 2008 21:45:13 +0800, Oliver Graeser wrote:
I need a >49 bit integer type. tried sizeof(long long), says 8. 8 byte =
64 bit right? but when I try to assign a value with more than 32 bit,
it fails. To illustrate:
Maybe your 64 bit "int long long" holds positive and negative numbers.
Is there an "unsigned" type you can use?

Sep 25 '08 #4
Oliver Graeser wrote:
I need a >49 bit integer type. tried sizeof(long long), says 8. 8 byte =
64 bit right? but when I try to assign a value with more than 32 bit,
it fails. To illustrate:

for (i=0; i<64; i++){
long long int k = 1<<i;
Try changing this to

long long int k = 1LL << i; // note the suffix after '1'.

You were shifting a simple int (1 is of type int), and its range is more
limited than that of 'long long'.
>
cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}
results in

1 2 8
2 4 8
3 8 8
4 16 8
5 32 8
6 64 8
7 128 8
8 256 8
9 512 8
10 1024 8
11 2048 8
12 4096 8
13 8192 8
14 16384 8
15 32768 8
16 65536 8
17 131072 8
18 262144 8
19 524288 8
20 1048576 8
21 2097152 8
22 4194304 8
23 8388608 8
24 16777216 8
25 33554432 8
26 67108864 8
27 134217728 8
28 268435456 8
29 536870912 8
30 1073741824 8
31 -2147483648 8
32 1 8
33 2 8
34 4 8
35 8 8
36 16 8
.....

and so on.

I'm beyond confused - can anyone here help me out? Machine is a Core 2
Duo Macbook Pro with OSX10.5, gcc, Xcode.

Thanks

Oliver
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Sep 25 '08 #5
In message <vd******************************@speakeasy.net> , A. W.
Dunstan <no@spam.thankswrites
>Oliver Graeser wrote:
>I need a >49 bit integer type. tried sizeof(long long), says 8. 8 byte =
64 bit right? but when I try to assign a value with more than 32 bit,
it fails. To illustrate:

for (i=0; i<64; i++){
long long int k = 1<<i;

cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}
results in

1 2 8
....
>30 1073741824 8
31 -2147483648 8
32 1 8
33 2 8
34 4 8
35 8 8
36 16 8
.....

and so on.

I'm beyond confused - can anyone here help me out? Machine is a Core 2
Duo Macbook Pro with OSX10.5, gcc, Xcode.

1 is an int, so when you shift it left by more than 32 you wrap around.
Worse. When you shift it left by 32 or more, you get UB.

(assuming 'int' is 32 bits on this machine.)

5.8/1:
"The behavior is undefined if the right operand is negative, or
greater than or equal to the length in bits of the promoted left
operand."
The
(int) result fits nicely into a 'long long', so the compiler has no reason
to complain. Try this:

const long long int ONE=1L;
That would be a 'long' literal, not 'long long'.
>for (i=0; i<64; i++){
long long int k = ONE << i;
cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}
--
Richard Herring
Sep 25 '08 #6
In article <gb**********@ijustice.itsc.cuhk.edu.hk>, Oliver Graeser
<gr*****@phy.cuhk.edu.hkwrote:
I need a >49 bit integer type. tried sizeof(long long), says 8. 8 byte =
64 bit right?
long long isn't part of C++. Since you're relying on compiler extensions,
you might as well use int64_t from <stdint.hif you want a 64-bit
integer, or int_least64_t if 64 bits or greater is acceptable.
Sep 25 '08 #7
Richard Herring wrote:
In message <vd******************************@speakeasy.net> , A. W.
Dunstan <no@spam.thankswrites
[..]
> The
(int) result fits nicely into a 'long long', so the compiler has no
reason
to complain. Try this:

const long long int ONE=1L;

That would be a 'long' literal, not 'long long'.
That actually doesn't matter. It could be

const long long int ONE = 1;

or

const long long int ONE = '\1';

the conversion should still yield a suitable value in 'ONE'.
>for (i=0; i<64; i++){
long long int k = ONE << i;
cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Sep 25 '08 #8
Richard Herring wrote:
>1 is an int, so when you shift it left by more than 32 you wrap around.

Worse. When you shift it left by 32 or more, you get UB.

(assuming 'int' is 32 bits on this machine.)

5.8/1:
"The behavior is undefined if the right operand is negative, or
greater than or equal to the length in bits of the promoted left operand."
That's actually something which should be taken seriously. I remember
back when I was developing on some UltraSparc architecture that if you
shifted an integer by more bits than there was in the integer, the
result would be, IIRC, the original value of that integer (rather than
zero, like AFAIK happens with intel CPUs). In other words, if the amount
of shift was invalid, the UltraSparc would simply not execute it
(leaving the original value of the integer intact). This can come as a
surprise to many.
Sep 25 '08 #9
On Sep 25, 6:41 pm, Richard Herring <ju**@[127.0.0.1]wrote:
In message <vd2dnRWiHbWCBEbVnZ2dnUVZ_tfin...@speakeasy.net> , A. W.
Dunstan <n...@spam.thankswrites
Oliver Graeser wrote:
I need a >49 bit integer type. tried sizeof(long long), says 8. 8 byte=
64 bit right? but when I try to assign a value with more than 32 bit,
it fails. To illustrate:
for (i=0; i<64; i++){
long long int k = 1<<i;
cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}
results in
1 2 8
...
30 1073741824 8
31 -2147483648 8
32 1 8
33 2 8
34 4 8
35 8 8
36 16 8
.....
and so on.
I'm beyond confused - can anyone here help me out? Machine
is a Core 2 Duo Macbook Pro with OSX10.5, gcc, Xcode.
1 is an int, so when you shift it left by more than 32 you
wrap around.
Worse. When you shift it left by 32 or more, you get UB.
And it certainly doesn't wrap.

(But am I the only one who absolutely refuses to use shift
operators on signed types.)
(assuming 'int' is 32 bits on this machine.)
5.8/1:
"The behavior is undefined if the right operand is negative, or
greater than or equal to the length in bits of the promoted left
operand."
The
(int) result fits nicely into a 'long long', so the compiler has no reason
to complain. Try this:
const long long int ONE=1L;
That would be a 'long' literal, not 'long long'.
But ONE would be an integral constant of type long long.
for (i=0; i<64; i++){
long long int k = ONE << i;
cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}
--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Sep 25 '08 #10
On Sep 25, 7:44 pm, Juha Nieminen <nos...@thanks.invalidwrote:
Richard Herring wrote:
1 is an int, so when you shift it left by more than 32 you wrap around..
Worse. When you shift it left by 32 or more, you get UB.
(assuming 'int' is 32 bits on this machine.)
5.8/1:
"The behavior is undefined if the right operand is negative, or
greater than or equal to the length in bits of the promoted left operand."
That's actually something which should be taken seriously. I
remember back when I was developing on some UltraSparc
architecture that if you shifted an integer by more bits than
there was in the integer, the result would be, IIRC, the
original value of that integer (rather than zero, like AFAIK
happens with intel CPUs). In other words, if the amount of
shift was invalid, the UltraSparc would simply not execute it
(leaving the original value of the integer intact). This can
come as a surprise to many.
I think that on a lot of architectures, i << n will actually
execute as i << (n % B), where B is the number of bits in i. So
that on a 32 bit machine, i << 32 shifts 0, i << 33 shifts 1,
etc.

Of course, if the shift count is a constant, the compiler should
warn.

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Sep 25 '08 #11
that is because i and 1 is not long long, and therefore the result of 1<<i
is not long long, not enough to hold a long long value.
just try this:

long long int i,one=1;
for (i=0; i<64; i++){
long long int k = one<<i;
cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}
"Oliver Graeser" <gr*****@phy.cuhk.edu.hk写入消æ¯
news:gb**********@ijustice.itsc.cuhk.edu.hk...
I need a >49 bit integer type. tried sizeof(long long), says 8. 8 byte =
64 bit right? but when I try to assign a value with more than 32 bit, it
fails. To illustrate:

for (i=0; i<64; i++){
long long int k = 1<<i;

cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}

results in

1 2 8
2 4 8
3 8 8
4 16 8
5 32 8
6 64 8
7 128 8
8 256 8
9 512 8
10 1024 8
11 2048 8
12 4096 8
13 8192 8
14 16384 8
15 32768 8
16 65536 8
17 131072 8
18 262144 8
19 524288 8
20 1048576 8
21 2097152 8
22 4194304 8
23 8388608 8
24 16777216 8
25 33554432 8
26 67108864 8
27 134217728 8
28 268435456 8
29 536870912 8
30 1073741824 8
31 -2147483648 8
32 1 8
33 2 8
34 4 8
35 8 8
36 16 8
.....

and so on.

I'm beyond confused - can anyone here help me out? Machine is a Core 2 Duo
Macbook Pro with OSX10.5, gcc, Xcode.

Thanks

Oliver
Sep 26 '08 #12
There's no need to use a variable for the constant 1 just to make the
type long long. You can also use a suffix (ll for long long):

long long int i;
for (i=0ll; i<64ll; i++){
long long int k = 1ll << i;
cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}

----- Original Message -----
From: farseerfc
Date: 26.09.2008 09:26
that is because i and 1 is not long long, and therefore the result of 1<<i
is not long long, not enough to hold a long long value.
just try this:

long long int i,one=1;
for (i=0; i<64; i++){
long long int k = one<<i;
cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}
"Oliver Graeser" <gr*****@phy.cuhk.edu.hk写入消æ¯
news:gb**********@ijustice.itsc.cuhk.edu.hk...
>I need a >49 bit integer type. tried sizeof(long long), says 8. 8 byte
= 64 bit right? but when I try to assign a value with more than 32
bit, it fails. To illustrate:

for (i=0; i<64; i++){
long long int k = 1<<i;

cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}

results in

1 2 8
2 4 8
3 8 8
4 16 8
5 32 8
6 64 8
7 128 8
8 256 8
9 512 8
10 1024 8
11 2048 8
12 4096 8
13 8192 8
14 16384 8
15 32768 8
16 65536 8
17 131072 8
18 262144 8
19 524288 8
20 1048576 8
21 2097152 8
22 4194304 8
23 8388608 8
24 16777216 8
25 33554432 8
26 67108864 8
27 134217728 8
28 268435456 8
29 536870912 8
30 1073741824 8
31 -2147483648 8
32 1 8
33 2 8
34 4 8
35 8 8
36 16 8
.....

and so on.

I'm beyond confused - can anyone here help me out? Machine is a Core 2
Duo Macbook Pro with OSX10.5, gcc, Xcode.

Thanks

Oliver
Sep 26 '08 #13
;-p, thank you telling me the suffix from
but 1ll seems too much like 111, 1LL should be better

and is the suffix of unsigned long long int ULL? maybe we could write 0ULL
to mean NULL, how beauty C++ is!

Just a joke~

"Stefan Rondinelli" <ro***@polizisten-duzer.dewrote
news:9e**************************@news.cyberlink.c h...
There's no need to use a variable for the constant 1 just to make the type
long long. You can also use a suffix (ll for long long):

long long int i;
for (i=0ll; i<64ll; i++){
long long int k = 1ll << i;
cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}

----- Original Message -----
From: farseerfc
Date: 26.09.2008 09:26
>that is because i and 1 is not long long, and therefore the result of
1<<i
is not long long, not enough to hold a long long value.
just try this:

long long int i,one=1;
for (i=0; i<64; i++){
long long int k = one<<i;
cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}
"Oliver Graeser" <gr*****@phy.cuhk.edu.hk写入消æ¯
news:gb**********@ijustice.itsc.cuhk.edu.hk...
>>I need a >49 bit integer type. tried sizeof(long long), says 8. 8 byte =
64 bit right? but when I try to assign a value with more than 32 bit, it
fails. To illustrate:

for (i=0; i<64; i++){
long long int k = 1<<i;

cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}

results in

1 2 8
2 4 8
3 8 8
4 16 8
5 32 8
6 64 8
7 128 8
8 256 8
9 512 8
10 1024 8
11 2048 8
12 4096 8
13 8192 8
14 16384 8
15 32768 8
16 65536 8
17 131072 8
18 262144 8
19 524288 8
20 1048576 8
21 2097152 8
22 4194304 8
23 8388608 8
24 16777216 8
25 33554432 8
26 67108864 8
27 134217728 8
28 268435456 8
29 536870912 8
30 1073741824 8
31 -2147483648 8
32 1 8
33 2 8
34 4 8
35 8 8
36 16 8
.....

and so on.

I'm beyond confused - can anyone here help me out? Machine is a Core 2
Duo Macbook Pro with OSX10.5, gcc, Xcode.

Thanks

Oliver
Sep 26 '08 #14
Victor Bazarov wrote:
Oliver Graeser wrote:
>I need a >49 bit integer type. tried sizeof(long long), says 8. 8 byte
= 64 bit right? but when I try to assign a value with more than 32
bit, it fails. To illustrate:

for (i=0; i<64; i++){
long long int k = 1<<i;

Try changing this to

long long int k = 1LL << i; // note the suffix after '1'.

You were shifting a simple int (1 is of type int), and its range is more
limited than that of 'long long'.
> cout<<i<<"\t"<<k<<"\t"<<sizeof(k)<<"\n";
}
Indeed this works. Thanks a lot, wasn't aware that directly typed
numbers are always int. Also tried k=100000000000000 but it wouldn't
even compile.
Sep 26 '08 #15
On 2008-09-26 07:41:11 -0400, Oliver Graeser <gr*****@phy.cuhk.edu.hksaid:
>
Indeed this works. Thanks a lot, wasn't aware that directly typed
numbers are always int.
Just to complicate matters, that's true if the value will fit in an
int. If it's too large, it has a type that's large enough to hold it.

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Sep 26 '08 #16

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

8
by: Tim Clacy | last post by:
How is a 64 bit type defined in strict C++? It seems C has support for 'long long' since C99, but not so for C++? Looking through one compiler vendor's standard library headers has clouded the...
7
by: William Payne | last post by:
Hello, I have a variable of type unsigned long. It has a number of bits set (with set I mean they equal one). I need to determine those bits and their position and create new numbers from them. For...
1
by: Crimarc | last post by:
I come back to ask qustion what did he promised you that you soudned so much happy and sometime later so painful like you heart broken becase of his dificults ???? What did you sacrifice for C++...
5
by: Mark Shelor | last post by:
Problem: find a portable way to determine whether a compiler supports the "long long" type of C99. I thought I had this one solved with the following code: #include <limits.h> #ifdef...
9
by: luke | last post by:
Hi everybody, please, can someone explain me this behaviour. I have the following piece of code: long long ll; unsigned int i = 2; ll = -1 * i; printf("%lld\n", ll);
21
by: Charles Sullivan | last post by:
I maintain/enhance some inherited FOSS software in C which has compiler options for quite a few different Unix-like operating systems, many of which I've never even heard of. It would be...
12
by: Ahmad Jalil Qarshi | last post by:
Hi, I have an integer value which is very long like 9987967441778573855. Now I want to convert it into equivalent Hex value. The result must be 8A9C63784361021F I have used...
2
by: PengYu.UT | last post by:
Hi, In python, triple quote (""") can be used to quote a paragraph (multiple lines). I'm wondering if there is any equivalent in C++. For the following code, I could write the long string in a...
10
by: ratcharit | last post by:
Currently using cosine function in math.h Currently I get: 1 = cos(1e^-7) Is there another way for cos to return value of high accuracy say: 0.999999 = cos(1e^-7)
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
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
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
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...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
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
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...

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.