[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [PROGRAMMERING] [C64] sizeof(unsigned long)!=4



On Tue, 4 Apr 2006 08:49:04 +0200
Klaus wrote:

> > Compiler jeg programmet på 64bit (puhh, det var heldigt jeg havde
> > kildeteksten), så er sizeof(unsigned long)==8. Hvorfor det?
> Fordi længden af en long afhænger af hvilken arkitektur du compiler på.
> C standarden definerer kun mindste størrelsen af typerne, og de er:
> 
> int:		16 bits
> long:		32 bits
> long long:	64 bits
> 
> På de fleste 32 bit arkitekturer er int så defineret til 32 bits, og
> long er også 32 bits. På 64 bit arkitekturer er int som regel 32 bits,
> og long 64 bits.
> 
> > Kan man ikke regne med hvor lang en long er?
> Jo :-) Men ikke når du flytter koden imellem forskellige arkitekturer.

Så egentlig er svaret nej. Forklaring ndf.

> 
> > Iøvrigt lidt mærkeligt at max stadig kun er 4mia for en long.

   hmmm ... skulle long være blevet større med årene, ligesom min nevø?;-)

> Det er det så heller ikke.
> 
> > 32 bit CPU gcc-2.96:
> >         int:  4 bytes 4294967295
> >        long:  4 bytes 4294967295
> > u long long:  8 bytes 18446744073709551615
> > long double: 12 bytes
> >       off_t:  4 bytes
> > 
> > 64 bit CPU gcc-3.4.4:
> >         int:  4 bytes 4294967295
> >        long:  8 bytes 4294967295
> > u long long:  8 bytes 18446744073709551615
> > long double: 16 bytes
> >       off_t:  8 bytes
> > 
> > Her er koden:
> > 
> > unsigned long long llu;
> > memset(&llu, 0xFF, sizeof(llu));
> > printf("long:%3d bytes %u\n", sizeof(long), (unsigned long)llu);
> Du skal huske at bruge %lu når du vil skrive en long ud, og %llu når du
> vil skrive en long long ud.. %u siger bare at det er en integer, og det
> er formentlig grunden til at du får kortet din long ned til 4 bytes. Mon
> ikke også din compiler ville have advaret dig, hvis du havde compilet
> med -Wall?

Ideen med typesystemet i C er, at int er maskinens hurtigste og
long er større end int etc. Det er i nogle tilfælde hurtigere at
konvertere char til int og bruge int i sammenligninger m.v. end at
bruge et 8 bit register, som ikke findes på alle maskiner.

Man har ikke villet ændre grundlæggende på sprogets typer for ikke
at invalidere ældre kode fuldstændigt.

Man har med C99 eller tillæg indført en __int8_t __int16_t og så
videre fordi man skal kunne skrive/læse filer på tværs af platforme
dog skal man huske at Little Endian ikke er det normale udenfor ia32,
forhåbentlig bliver det det engang.


Fra bits/types.h som includeres fra sys/types.h (min gamle
gcc-3.3.2 med glibc-2.2.4-24:)

typedef signed char __int8_t;
typedef unsigned char __uint8_t;
typedef signed short int __int16_t;
typedef unsigned short int __uint16_t;
typedef signed int __int32_t;
typedef unsigned int __uint32_t;
#ifdef __GNUC__
__extension__ typedef signed long long int __int64_t;
__extension__ typedef unsigned long long int __uint64_t;
#endif

   ... mens stdint.h har dem uden prefix-underscore!

typedef signed char             int8_t;
typedef short int               int16_t;
typedef int                     int32_t;


For at printformatere en long long har gcc/glibc  den
særlige %qu og %qd format-kode.

#include <stdio.h>

int main(int argc, char *argv[])
{
   long long int jj;

   jj = -1;
   printf("long long jj %qd\n",jj);
   printf("unsigned long long jj %qu\n",(unsigned long long)jj);
   return 0;
}


-- 
donald_j_axel donax snabela get2net.dk -- http://d-axel.dk/


 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2006-05-01, 02:01 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *