Primitiv datatype - Primitive data type

Inden for datalogi er primitiv datatype en af ​​følgende:

  • en grundtype er en datatype leveret af et programmeringssprog som en grundlæggende byggesten. De fleste sprog tillader mere komplicerede sammensatte typer at blive rekursivt konstrueret ud fra grundlæggende typer.
  • en indbygget type er en datatype, som programmeringssproget giver indbygget support til.

I de fleste programmeringssprog er alle grundlæggende datatyper indbygget. Derudover indeholder mange sprog også et sæt sammensatte datatyper.

Afhængigt af sproget og dets implementering kan primitive datatyper måske ikke have en-til-en-korrespondance med objekter i computerens hukommelse. Imidlertid forventer man normalt, at operationer på grundlæggende primitive datatyper er de hurtigste sprogkonstruktioner, der findes. Heltalstilsætning kan f.eks. Udføres som en enkelt maskininstruktion, og nogle processorer tilbyder specifikke instruktioner til at behandle sekvenser af tegn med en enkelt instruktion. C -standarden nævner især, at "et" almindeligt "int -objekt har den naturlige størrelse, der foreslås af udførelsesmiljøets arkitektur." Dette betyder, at intdet sandsynligvis vil være 32 bit langt på en 32-bit arkitektur. Grundlæggende primitive typer er næsten altid værdityper .

De fleste sprog tillader ikke adfærd eller muligheder for primitive (enten indbyggede eller grundlæggende) datatyper at blive ændret af programmer. Undtagelser inkluderer Smalltalk , som gør det muligt at udvide alle datatyper inden for et program, tilføje til de operationer, der kan udføres på dem eller endda redefinere de indbyggede operationer.

Oversigt

Den faktiske række primitive datatyper, der er tilgængelig, afhænger af det specifikke programmeringssprog, der bruges. For eksempel i C # , strenge er en sammensat, men indbygget datatype, mens der i moderne dialekter af BASIC og i JavaScript , er de sidestilles med en primitiv datatype, der er både basisk og indbygget.

Klassiske grundlæggende primitive typer kan omfatte:

Ovenstående primitiver understøttes generelt mere eller mindre direkte af computerhardware, bortset fra muligvis flydende punkt, så operationer på sådanne primitiver er normalt ret effektive. Nogle programmeringssprog understøtter tekststrenge som en primitiv (f.eks. BASIC), mens andre behandler en tekststreng som en række tegn (f.eks. C). Nogle computerhardware (f.eks. X86) har instruktioner, der hjælper med at håndtere tekststrenge, men komplet hardware -understøttelse af tekststrenge er sjælden.

Strenge kan være en hvilken som helst serie af tegn i den brugte kodning . For at adskille strenge fra kode omslutter de fleste sprog dem med enkelt eller dobbelt anførselstegn. For eksempel "Hello World" eller "Hello World". Bemærk, at "200" kan forveksles med en heltalstype, men faktisk er en strengtype, fordi den er indeholdt i dobbelte anførselstegn.

Mere sofistikerede typer, der kan indbygges, omfatter:

Specifikke primitive datatyper

Heltalstal

En heltal datatype repræsenterer en vis række matematiske heltal . Heltal kan enten være signeret (tillader negative værdier) eller usignerede (kun ikke-negative heltal ). Almindelige områder er:

Størrelse ( bytes ) Størrelse ( bits ) Navne Signeret rækkevidde (forudsat to's supplement til signeret ) Usigneret sortiment
1 byte 8 bits Byte , oktet , minimumsstørrelse på chari C99 (se grænser. H CHAR_BIT) −128 til +127 0 til 255
2 bytes 16 bits x86 ord , minimumsstørrelse på shortog inti C −32.768 til +32.767 0 til 65.535
4 bytes 32 bits x86 dobbelt ord, minimumsstørrelse på longi C, faktisk størrelse intfor de fleste moderne C -kompilatorer, markør til IA -32 -kompatible processorer −2.147.483.648 til +2.147.483.647 0 til 4.294.967.295
8 bytes 64 bits x86 firdobbelt ord, minimumsstørrelse på long longi C, faktisk størrelse longfor de fleste moderne C -kompilatorer, markør til x86-64 -kompatible processorer −9,223,372,036,854,775,808 til +9,223,372,036,854,775,807 0 til 18.446.744.073.709.551.615
ubegrænset/8 ubegrænset Bignum –2 ubegrænset /2 til +(2 ubegrænset /2 - 1) 0 til 2 ubegrænset - 1

Bogstaver for heltal kan skrives som almindelige arabiske tal , der består af en række cifre og med negation angivet med et minustegn før værdien. De fleste programmeringssprog tillader imidlertid ikke brug af kommaer eller mellemrum til ciffergruppering . Eksempler på heltalsbokstaver er:

  • 42
  • 10000
  • -233000

Der er flere alternative metoder til at skrive heltalsbokstaver på mange programmeringssprog:

  • De fleste programmeringssprog, især dem, der er påvirket af C , præfikerer et helt tal bogstaveligt med 0X eller 0x for at repræsentere en hexadecimal værdi, f.eks. 0xDEADBEEF . Andre sprog kan bruge en anden notation, f.eks. Tilføjer nogle samlingssprog et H eller h til slutningen af ​​en hexadecimal værdi.
  • Perl , Ruby , Java , Julia , D , Rust og Python (startende fra version 3.6) tillader indlejrede understregninger for klarhed, f.eks. 10_000_000 , og fastform i Fortran ignorerer indlejrede mellemrum i heltalsbokstaver.
  • I C og C ++ angiver et førende nul en oktalværdi , f.eks. 0755 . Dette var primært beregnet til at blive brugt med Unix -tilstande ; det er imidlertid blevet kritiseret, fordi normale heltal også kan føre med nul. Som sådan præfikserer Python , Ruby , Haskell og OCaml oktalværdier med 0O eller 0o efter det layout, der bruges af hexadecimale værdier.
  • Flere sprog, herunder Java , C# , Scala , Python , Ruby og OCaml , kan repræsentere binære værdier ved at præfiksere et tal med 0B eller 0b .

Flydende tal

Et flydende tal repræsenterer et rationelt tal med begrænset præcision, der kan have en brøkdel. Disse tal gemmes internt i et format, der svarer til videnskabelig notation , typisk i binær men undertiden i decimal . Fordi floating-point-tal har begrænset præcision, er kun en delmængde af reelle eller rationelle tal nøjagtigt repræsentative; andre tal kan kun repræsenteres cirka.

Mange sprog har både en enkelt præcision (ofte kaldet "float") og en dobbelt præcisionstype .

Bogstaver til flydende tal omfatter et decimalpunkt og bruger typisk e eller E til at betegne videnskabelig notation. Eksempler på floating-point-bogstaver er:

  • 20.0005
  • 99,9
  • -5000,12
  • 6.02e23

Nogle sprog (f.eks. Fortran , Python , D ) har også en kompleks nummertype, der består af to flydende tal: en reel del og en imaginær del.

Fixed-point tal

Et fastpunktsnummer repræsenterer et rationelt tal med begrænset præcision, der kan have en brøkdel. Disse tal gemmes internt i et skaleret heltal, typisk i binær men undertiden i decimal . Fordi fastpunktsnumre har begrænset præcision, er det kun en delmængde af reelle eller rationelle tal, der er nøjagtigt repræsentative; andre tal kan kun repræsenteres cirka. Fixed-point tal har også en tendens til at have et mere begrænset værdiområde end flydende punkt , og derfor skal programmøren være forsigtig med at undgå overløb i mellemliggende beregninger såvel som det endelige resultat.

Booleanske

En boolsk type, typisk betegnet "bool" eller "boolean", er typisk en logisk type, der enten kan have værdien "true" eller værdien "false". Selvom kun en bit er nødvendig for at rumme værdisættet "sand" og "falsk", implementerer programmeringssprog typisk boolske typer som en eller flere bytes.

Mange sprog (f.eks. Java , Pascal og Ada ) implementerer booleans, der overholder begrebet boolean som en tydelig logisk type. Sprog kan dog implicit implicit konvertere booleanere til numeriske typer til tider for at give udvidet semantik til booleanske og boolske udtryk eller for at opnå bagudkompatibilitet med tidligere versioner af sproget. For eksempel havde tidlige versioner af C -programmeringssproget, der fulgte ANSI C og dets tidligere standarder, ikke en dedikeret boolsk type. I stedet fortolkes numeriske værdier på nul som "falsk", og enhver anden værdi fortolkes som "sand". Den nyere C99 tilføjede en tydelig boolsk type, der kan inkluderes med stdbool.h , og C ++ understøtter boolsom en indbygget type og "sand" og "falsk" som reserverede ord.

Karakterer og strygere

En tegntype (typisk kaldet "char") kan indeholde et enkelt bogstav , ciffer , tegnsætningstegn , symbol , formateringskode, kontrolkode eller en anden specialiseret kode (f.eks. Et byteordremærke ). I C , chardefineres som den mindste adresserbare enhed hukommelse. På de fleste systemer er dette 8 bits ; Flere standarder, f.eks. POSIX , kræver, at den er i denne størrelse. Nogle sprog har to eller flere tegntyper, f.eks. En enkeltbyte-type for ASCII- tegn og en multi-byte-type for Unicode- tegn. Udtrykket "tegntype" bruges normalt selv for typer, hvis værdier mere præcist repræsenterer kodenheder , f.eks. En UTF-16 -kodenhed som i Java (understøttet begrænset til 16-bit tegn) og JavaScript .

Tegn kan kombineres til strenge . Strengdataene kan indeholde tal og andre numeriske symboler, men behandles som tekst. For eksempel kan de matematiske operationer, der kan udføres på en numerisk værdi (f.eks. 200) generelt ikke udføres på den samme værdi, der er skrevet som en streng (f.eks. "200").

Strenge implementeres på forskellige måder afhængigt af programmeringssproget. Den enkleste måde at implementere strenge på er at oprette dem som en række tegn efterfulgt af et afgrænsende tegn, der bruges til at signalere slutningen af ​​strengen, normalt NUL . Disse omtales som null-terminerede strenge og findes normalt på sprog med en lav hardware-abstraktion , såsom C og Assembly . Selvom de er lette at implementere, er null -terminerede strenge blevet kritiseret for at forårsage bufferoverløb . De fleste script-sprog på højt niveau, såsom Python , Ruby og mange BASIC- dialekter , har ingen separat tegntype; strenge med en længde på en bruges normalt til at repræsentere enkelte tegn. Nogle sprog, såsom C ++ og Java , har evnen til at bruge null-terminerede strenge (normalt til bagudkompatibilitetstiltag), men giver desuden deres egen klasse til strenghåndtering ( std::stringog java.lang.Stringhenholdsvis) i standardbiblioteket.

Der er også en forskel på, om strenge er mutable eller immutable i et sprog. Omskiftelige strenge kan ændres efter deres oprettelse, hvorimod uforanderlige strenge opretholder en konstant størrelse og indhold. I sidstnævnte er den eneste måde at ændre strenge på at oprette nye. Der er både fordele og ulemper ved hver tilgang: Selvom uforanderlige strenge er meget mindre fleksible, er de enklere og helt trådsikre . Nogle eksempler på sprog, der bruger mutable strenge, omfatter C ++ , Perl og Ruby , hvorimod sprog, der ikke inkluderer JavaScript , Lua , Python og Go . Et par sprog, f.eks. Objective-C , giver forskellige typer til foranderlige og uforanderlige strenge.

Bogstaver til tegn og strenge er normalt omgivet af anførselstegn : nogle gange bruges enkelte anførselstegn ( ' ) til tegn, og dobbelte anførselstegn ( " ) bruges til strenge. Python accepterer begge varianter for sin strengnotation.

Eksempler på tegn i C -syntaks er:

Eksempler på strenglitteraler i C -syntaks er:

  • "EN"
  • "Hej Verden"
  • "Der er 4 katte."

Numeriske datatypeområder

Hver numerisk datatype har sin maksimale og mindste værdi kendt som intervallet . Forsøg på at gemme et nummer uden for området kan føre til compiler/runtime -fejl eller til forkerte beregninger (på grund af afkortning ) afhængigt af det sprog, der bruges.

Intervallet for en variabel er baseret på antallet af bytes, der bruges til at gemme værdien, og en heltal datatype er normalt i stand til at gemme 2 n værdier (hvor n er antallet af bits, der bidrager til værdien). For andre datatyper (f.eks. Floating-point- værdier) er området mere kompliceret og vil variere afhængigt af den metode, der bruges til at gemme det. Der er også nogle typer, der ikke bruger hele bytes, f.eks. En boolean, der kræver en enkelt bit , og repræsenterer en binær værdi (selvom der i praksis ofte bruges en byte, hvor de resterende 7 bits er overflødige). Nogle programmeringssprog (f.eks. Ada og Pascal ) tillader også den modsatte retning, det vil sige, at programmøren definerer det område og den præcision, der er nødvendig for at løse et givet problem, og kompilatoren vælger automatisk den mest passende heltal eller floating-point type.

Se også

Referencer

eksterne links