Sida 2 av 5
Re: C data types, tar knäcken på mig
Postat: 16 december 2013, 22:19:46
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
Re: C data types, tar knäcken på mig
Postat: 16 december 2013, 22:35:31
av ekman
Tack för förklarandet
sodjan
Jag har lärt mig en sak idag ialf

Re: C data types, tar knäcken på mig
Postat: 16 december 2013, 22:51:41
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.
Re: C data types, tar knäcken på mig
Postat: 16 december 2013, 22:57:51
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

Re: C data types, tar knäcken på mig
Postat: 16 december 2013, 23:09:10
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
Re: C data types, tar knäcken på mig
Postat: 16 december 2013, 23:11:31
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.
Re: C data types, tar knäcken på mig
Postat: 16 december 2013, 23:45:03
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
Re: C data types, tar knäcken på mig
Postat: 17 december 2013, 21:02:32
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.
Re: C data types, tar knäcken på mig
Postat: 17 december 2013, 21:08:59
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.
Re: C data types, tar knäcken på mig
Postat: 17 december 2013, 21:41:32
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.
Re: C data types, tar knäcken på mig
Postat: 18 december 2013, 04:43:46
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.
Re: C data types, tar knäcken på mig
Postat: 18 december 2013, 16:56:31
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.
Re: C data types, tar knäcken på mig
Postat: 18 december 2013, 17:48:21
av baron3d
kimmen du har rätt.
Hade en lärare som "lärde" mig detta. Har efter lite googlande sett att det är fel.

Re: C data types, tar knäcken på mig
Postat: 18 december 2013, 19:22:40
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?
Re: C data types, tar knäcken på mig
Postat: 18 december 2013, 21:13:43
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.