26. februar 2003 - 20:33
Der er
17 kommentarer og 2 løsninger
har c++ ændret sig?
Jeg sider her med et blad af Kris Jamsa titlen er "C++" Kan det være en fejl jeg har fundet i dette IDG blad? Der står at jeg vil få en overflow når jeg skriver følgende: ---------------------------- #include <iostream.h> void main(void) { int resultat; resultat = 200 * 300; cout << "200 * 300 = " << resultat << endl; } ---------------------------- Denne lille kode skulle ifølge mit hæfte vise følgende på skærmen: C:\cpp\>REGNOVER <enter> 200 * 300 = -5536 MEN!! jeg får det til: 200 * 300 = 60000 i min dos prompt Er der nogen der kan forklare dette?
Annonceindlæg fra Salesforce
26. februar 2003 - 20:36
#1
Det er fordi der ikke er faste størrelser på de indbyggede datatyper (int, float osv.). Mon ikke Kris Jamsa er gået udfra at en int er 16 bit signed, mens din compiler bruger 32 bit signed.. Hvilken compiler bruger du ?
26. februar 2003 - 20:36
#2
det virker har...men ved ikke hvorfor dit ikke virker
26. februar 2003 - 20:38
#3
Jeg bruger Dev-C++ på win ME
26. februar 2003 - 20:39
#4
Søren har helt ret. Det afhænger af hvilken compiler du bruger.
26. februar 2003 - 20:40
#5
Fordi den platform/kompiler han kørte på har int ligget i 2 bytes....
26. februar 2003 - 20:40
#6
Du har måske en bedre compiler? Jeg har ikke selv så meget styr på c++ endnu og jeg får jo ikke nogen compiler fejl når jeg compiler den
26. februar 2003 - 20:42
#7
Der står også her i hæftet: ...Da resultatet af beregningen (60.000) ligger over den tilladte maksimumsværdi for en "int" (32.767), kommer der en overflow fejl
26. februar 2003 - 20:43
#8
skulle jeg bruge en anden compiler?
26. februar 2003 - 20:44
#9
Nu kan man ikke entydigt sige at den ene er "bedre" end det andet. Forskellige compilere har forskellig opførsel. Og begge er OK ifølge C++ standarden. Jeg vil dog nok sige at en C++ compiler som bruger 16 bit int's er ved at virke lidt gammeldags. Hvis du programmerer under Windows, så: - download den gratis dev-cpp eller: - køb MS VC++ eller Borland C++ Builder
26. februar 2003 - 20:46
#10
Næ, skift ikke kompiler. Vær' i stedet glad for at din integer kan indeholde langt højere tal!
26. februar 2003 - 20:48
#11
Nej, compileren er fin nok. Kris Jamsa's pointe er at der ikke er plads til et uendeligt stort tal i en variabel. F.eks. kan man i "limits.h" se følgende kode: #define INT_MAX 2147483647 #define INT_MIN (-INT_MAX-1) Altså, for en int gælder: maks = 2147483647 min = -2147483646 Hvis du vil have samme output som i bogen kan du prøve at udskifte int med short: int resultat; skal være: short resultat; For short gælder: #define SHRT_MAX 32767 #define SHRT_MIN (-SHRT_MAX-1)
26. februar 2003 - 20:48
#12
ja, men det vil ikke gå ud over mine fremtidige programmer hvis de skal køres på en gammel maskine?
26. februar 2003 - 20:49
#13
Klassisk regnefejl, det skal være: Altså, for en int gælder: maks = 2147483647 min = -2147483648
26. februar 2003 - 20:53
#14
Hvis dine programmer skal buildes med en ældre C compiler, så skal du tænke dig lidt om. En af de oplagte ting du kan gøre er at erklære dine variable til: long int i.s.f.: int så er der betydelig chance for at de bliver 32 bit !
26. februar 2003 - 20:56
#15
1. Størrelsen af de indbyggede typer afhænger ikke kun af, hvilken compiler, man bruger, men også den maskine, man afvikler koden på. 2. Ja, C++ har ændret sig og ændres stadig. C++ er ikke nogen endegyldig standard. C++ udvides jævnligt. 3. VC++ er i øvrigt ikke up to date mht standarden - heller ikke .Net udgaven. Men de finesser, der mangler, kommer du nok ikke til at savne før om et par år.
26. februar 2003 - 21:09
#16
Man kan ikke sige at der er fordi C++ standarden har ændret sig at du får et andet resultat end Jamsa. C++ standarden fastlægger ikke hvor mange bit der skal bruges til forskellige typer (lige undtagen char som skal være 8 bit). I stedet er der regler for at f.eks. en long int skal repræsenteres ved lige så mange eller flere bit end en int.
26. februar 2003 - 21:10
#17
Oliia > Jeg er ikke enig i dine betragtninger : 1. Når man har compileret noget C++ så ligger det _helt_ fast hvor mange bit f.eks. en int er repræsenteret ved - loaderen ændrer ikke på dette. 2. Som nævnt er det som brixz har set ikke et udtryk for at C++ standarden har ændret sig
26. februar 2003 - 21:22
#18
Jeg var vist noget uklar i min sprogbrug. 1. Enig, min pointe var sådan set, at compileren *kan* opføre sig forskelligt alt efter hvilken maskine, man benytter den på. Ye olde IFDEF's 2. Enig, men standarden *har* ændret sig. :)
26. februar 2003 - 21:29
#19
Okay tak for jeres svar alle sammen :)
Kurser inden for grundlæggende programmering