C data types, tar knäcken på mig

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
sodjan
EF Sponsor
Inlägg: 43245
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: C data types, tar knäcken på mig

Inlägg av sodjan »

> varför Char[4] inte är samma sak som en long?

Jag skulle just posta det att du skriver ut *pekaren* till första
tecknet i din char[4], inte innehåller som sådant, men det såg
ju flera... :-)

Men din fråga. Ja, båda skrivsätten kommer att allokera 4 bytes i minnet.
Men C i sig hanterar dessa "variabler" ganska olika.

När du skriver LongLBA så är det alltid innehållet/värdet som används.
Du kan även ange att du vill använda andessen med "&LongLBA".

När du skriver CharLBA så kommer C att avända *adressen* till CharLBA,
inte innehållet som sådant. Du kan komma åt innehåller på några olika sätt.
Du har redan fått metoden med en cast, och det fungerar ju. Här är ett par till.
Det som är inläst är "ABCD" (41424344 i hex) från en fil:

Kod: Markera allt

   printf("\nMed en cast:\n");
   printf("Relative LBA address 0x%08X\n", *((unsigned long*)CharLBA));

   printf("\nMed en pekarreferens:\n");
   printf("Relative LBA address 0x%08X\n", *CharLBA);   
   printf("Relative LBA address 0x%08X\n", *CharLBA+1);   
   printf("Relative LBA address 0x%08X\n", *CharLBA+2);   
   printf("Relative LBA address 0x%08X\n", *CharLBA+3);   

   printf("\nMed ett array index:\n");
   printf("Relative LBA address 0x%08X\n", CharLBA[0]);   
   printf("Relative LBA address 0x%08X\n", CharLBA[1]);   
   printf("Relative LBA address 0x%08X\n", CharLBA[2]);   
   printf("Relative LBA address 0x%08X\n", CharLBA[3]);
Det ger:

Kod: Markera allt

Med en cast:
Relative LBA address 0x44434241

Med en pekarreferens:
Relative LBA address 0x00000041
Relative LBA address 0x00000042
Relative LBA address 0x00000043
Relative LBA address 0x00000044

Med ett array index:
Relative LBA address 0x00000041
Relative LBA address 0x00000042
Relative LBA address 0x00000043
Relative LBA address 0x00000044
Relative LBA address 0x44434241
ekman
Inlägg: 280
Blev medlem: 13 januari 2009, 14:04:35

Re: C data types, tar knäcken på mig

Inlägg av ekman »

Tack för förklarandet sodjan :P
Jag har lärt mig en sak idag ialf :D
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46916
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: C data types, tar knäcken på mig

Inlägg av TomasL »

Att koda med att använda en castad char[4] istället för en long, är väl att be om problem.
Förstår inte varför du inte använder en long, som tänkt är i stället.
ekman
Inlägg: 280
Blev medlem: 13 januari 2009, 14:04:35

Re: C data types, tar knäcken på mig

Inlägg av ekman »

Nä för att testa. Jag såg inte varför det inte skulle funka, så jag testade. Så nu har jag lärt mig lite mer hur Char fungerar :)
Användarvisningsbild
kimmen
Inlägg: 2042
Blev medlem: 25 augusti 2007, 16:53:51
Ort: Stockholm (Kista)

Re: C data types, tar knäcken på mig

Inlägg av kimmen »

gkar skrev:För att göra en enkel sak lite mer komlicerad.

De olika datatyperna i C varierar kraftigt mellan olika arktekturer. En char kan vara 8 eller 16 bitar, eller där imellan.
En long är längre än en int, och en int kan vara 16 eller någoting annat, vilket gör att en long kan vara 17bitar även om jag akdrig sett en sådan long.
Det finns visst maskiner med 64 (!) bitars char också. :)

17 bitars long skulle dock inte gå då standarden kräver vissa minsta omfång för de olika typerna. För long är det +-(2^31-1) för signed long och 0-(2^32-1) för unsigned long, men det är fritt fram att ha större omfång på long än så (i praktiken fler bitar).

Här finns en liten lista:
http://stackoverflow.com/questions/6155 ... 32-64-bits
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46916
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: C data types, tar knäcken på mig

Inlägg av TomasL »

Nja, det är väl inte bara char utan allt vad som heter typer i C.
dessutom kan du aldrig vara säker på hur lång en typ är.
char - Smallest addressable unit of the machine that can contain basic character set. It is an integer type
short/short int - större än char.
int - större än char, oftast större än short.
long/long int - större än int
Så att räkna med att en typ är ett visst antal tecken lång, är helt felaktigt, och man får jätteproblem.
sodjan
EF Sponsor
Inlägg: 43245
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: C data types, tar knäcken på mig

Inlägg av sodjan »

> long/long int - större än int

Inte alltid, ibland är de av samma längd:

Kod: Markera allt

signed short       2 bytes    -32,768 to 32,767
unsigned short     2 bytes    0 to 65,535
signed int         4 bytes    -2,147,483,647 minus 1 to 2,147,483,647
unsigned int       4 bytes    0 to 4,294,967,295
signed long        4 bytes    -2,147,483,647 minus 1 to 2,147,483,647
unsigned long      4 bytes    0 to 4,294,967,295
signed long long   8 bytes    -9,223,372,036,854,775,807 minus 1 to 9,223,372,036,854,775,807
unsigned long long 8 bytes    0 to 18,446,744,073,709,551,615
http://pic.dhe.ibm.com/infocenter/zos/v ... ndards.htm
gkar
Inlägg: 1583
Blev medlem: 31 oktober 2011, 15:28:29
Ort: Linköping

Re: C data types, tar knäcken på mig

Inlägg av gkar »

kimmen skrev:
gkar skrev:För att göra en enkel sak lite mer komlicerad.

De olika datatyperna i C varierar kraftigt mellan olika arktekturer. En char kan vara 8 eller 16 bitar, eller där imellan.
En long är längre än en int, och en int kan vara 16 eller någoting annat, vilket gör att en long kan vara 17bitar även om jag akdrig sett en sådan long.
17 bitars long skulle dock inte gå då standarden kräver vissa minsta omfång för de olika typerna. För long är det +-(2^31-1) för signed long och 0-(2^32-1) för unsigned long, men det är fritt fram att ha större omfång på long än så (i praktiken fler bitar).
Är det så?! Visa mig texten i standarden som specificerar long till minst 32bitar.
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1353
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: C data types, tar knäcken på mig

Inlägg av baron3d »

En long SKALL vara så stor, eller större, att den rymmer en adress. Med andra ord bör en long och en pekare ha samma storlek.

Vilket innebär att om adressområdet är 16 bitar så kan en long vara 16 bitar.
Är adressen större än 32 bitar måste en long vara 64 bitar eller större.
sodjan
EF Sponsor
Inlägg: 43245
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: C data types, tar knäcken på mig

Inlägg av sodjan »

Allt är kanske inte alltid så enkelt och "hugget i sten".

T.ex HP-C för OpenVMS har :
short: 16 bit
int: 32 bit
long: 32 bit
long long: 64 bit

Sedan kan pekare vara 32 eller 64 bitar, default är 32 bit.
Det styrs med en switch till kompilatorn eller ett #pragma
i själva koden (så man kan blanda 32 och 64 bit pekare om
man vill). Det här är för 64 bitars maskiner för övrigt. Processer
körs normalt i en 32 bitars virtuell adressrymd, men det finns
rutiner som malloc64() för att allokera minne från 64 bitars
adressrymden (vilket malloc() ändras till om man har begärt
64 bitars pekare). Notera att definitionen av "long" dock
inte påverkas av att man kör 64 bit pekare.
thebolt
Inlägg: 248
Blev medlem: 10 februari 2008, 17:41:40
Ort: Taipei Taiwan

Re: C data types, tar knäcken på mig

Inlägg av thebolt »

gkar skrev: Är det så?! Visa mig texten i standarden som specificerar long till minst 32bitar.
ISO/IEC 9899:TC2
"5.2.4.2.1 Sizes of integer types <limits.h>
— minimum value for an object of type long int
LONG_MIN -2147483647 // −(231 − 1)
— maximum value for an object of type long int
LONG_MAX +2147483647 // 231 − 1
— maximum value for an object of type unsigned long int
ULONG_MAX 4294967295 // 232 − 1
"
Dvs en long måste vara minst 32 bitar.
Användarvisningsbild
kimmen
Inlägg: 2042
Blev medlem: 25 augusti 2007, 16:53:51
Ort: Stockholm (Kista)

Re: C data types, tar knäcken på mig

Inlägg av kimmen »

baron3d skrev:En long SKALL vara så stor, eller större, att den rymmer en adress. Med andra ord bör en long och en pekare ha samma storlek.

Vilket innebär att om adressområdet är 16 bitar så kan en long vara 16 bitar.
Är adressen större än 32 bitar måste en long vara 64 bitar eller större.
Enligt vilken standard?

C-standarden kräver att long skall effektivt ha minst 32 bitar för att uppfylla kravet på numeriskt omfång.
Jag är inte så insatt i just det, men möjligen krävs i POSIX-standarden att long skall kunna representera en pekare, men det ingår inte i C-standarden vad jag vet.

Ett exempel där long är kortare än pekare är 64-bitars Windows där long (och int) är 32 bitar medan pekare är 64 bitar.

Lämpliga typer för att (någorlunda) portabelt och standardmässigt räkna på pekare som tal är väl uintptr_t, intptr_t och ptrdiff_t.
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1353
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: C data types, tar knäcken på mig

Inlägg av baron3d »

kimmen du har rätt. :vissla:

Hade en lärare som "lärde" mig detta. Har efter lite googlande sett att det är fel. :shock:
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: C data types, tar knäcken på mig

Inlägg av jesse »

Det är väl det största misstaget i C-språkets historia att de inte definierade heltalstyperna fast. Det hade inte varit svårt att uppkalla dem efter antal bitar, eller varför inte antal bytes? Är det lika tokigt i C++ och C# att de har ärvt denna förvirring?
SvenW
Inlägg: 1156
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: C data types, tar knäcken på mig

Inlägg av SvenW »

Det kan så vara.
Ofta bättre att använda typerna som är i stdint.h:
int8_t, int16_t, int32_t, etc ...
och hoppas att det fungerar rätt med maskinen man använder.
Skriv svar