bugGNU Development Chain for 68HC11/68HC12 - Bugs: bug #30609, long long is not 64-bit as...

 
 

You are not allowed to post comments on this tracker with your current authentification level.

bug #30609: long long is not 64-bit as advertised, __uint64_t not 64-bit too

Submitted by:  None
Submitted on:  Sat 31 Jul 2010 12:44:27 AM UTC  
 
Category: gccSeverity: 3 - Normal
Item Group: NoneStatus: None
Privacy: PublicAssigned to: None
Open/Closed: Open

Wed 11 Aug 2010 12:26:35 AM UTC, comment #1:

According to my investigation, there may not be a problem. With the IAR Embedded Compiler, the integer constants work as shown. However, with this Gnu compiler I need to put "ll" at the end of the 64-bit constants. I guess this is acceptable for C, I haven't taken the time to look that up.

Also, for the multiplication, 64-bit multiplication results if I cast x to an unsigned long long in the line of code where the multiplication is invoked.

Craig Scratchley <scratchley>
Sat 31 Jul 2010 12:44:27 AM UTC, original submission:

Hi. Information on the compiler states:

************************
long long
unsigned long long
Long long are 64-bit entities. They are never allocated in a hard register. They are passed on the stack for operations. They are returned like a struct (in memory). Logical operations (and, or, xor) are generated inline. Other operations are made by a library call. Some shift operations are generated inline.

63 55 47 39 31 23 15 7 0
+------+------+------+------+------+------+------+------+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+------+------+------+------+------+------+------+------+
************************

However, I get the errors:

4 main.c
warning: integer constant is too large for "long" type
9 main.c
warning: integer constant is too large for "long" type

For the following program:

                  • begin main.c ***************

#include <sys/types.h>
//#include <machine/types.h>

__uint64_t b = 0x11111111876;
//u_int64_t a = 0x1111111187;

unsigned long int x = 0xffffffff;
unsigned long int y = 0xeeeeeeee;
unsigned long long z = 0x111111118;

int main ()
{
z = x * y;
return 0;
}

                  • end main.c ***************

Also, looking at the assembly generated (optimization turned off), the multiplication result doesn't seem to be 64 bit.

Anonymous

 

No files currently attached

 

Depends on the following items: None found

Items that depend on this one: None found

 

Carbon-Copy List
  • -unavailable- added by scratchley (Posted a comment)
  •  

    Do you think this task is very important?
    If so, you can click here to add your encouragement to it.
    This task has 0 encouragements so far.

    Only logged-in users can vote.

     

    Please enter the title of George Orwell's famous dystopian book (it's a date):

     

     

    No Changes Have Been Made to This Item

    Back to the top


    Powered by Savane 3.1-cleanup