Avatar billede brixz Nybegynder
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?
Avatar billede soreno Praktikant
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 ?
Avatar billede riversen Nybegynder
26. februar 2003 - 20:36 #2
det virker har...men ved ikke hvorfor dit ikke virker
Avatar billede brixz Nybegynder
26. februar 2003 - 20:38 #3
Jeg bruger Dev-C++ på win ME
Avatar billede arne_v Ekspert
26. februar 2003 - 20:39 #4
Søren har helt ret.

Det afhænger af hvilken compiler du bruger.
Avatar billede stigc Nybegynder
26. februar 2003 - 20:40 #5
Fordi den platform/kompiler han kørte på har int ligget i 2 bytes....
Avatar billede brixz Nybegynder
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
Avatar billede brixz Nybegynder
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
Avatar billede brixz Nybegynder
26. februar 2003 - 20:43 #8
skulle jeg bruge en anden compiler?
Avatar billede arne_v Ekspert
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
Avatar billede stigc Nybegynder
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!
Avatar billede soreno Praktikant
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)
Avatar billede brixz Nybegynder
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?
Avatar billede soreno Praktikant
26. februar 2003 - 20:49 #13
Klassisk regnefejl, det skal være:
Altså, for en int gælder:
maks = 2147483647
min = -2147483648
Avatar billede arne_v Ekspert
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 !
Avatar billede olila Nybegynder
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.
Avatar billede hsloth Novice
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.
Avatar billede hsloth Novice
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
Avatar billede olila Nybegynder
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. :)
Avatar billede brixz Nybegynder
26. februar 2003 - 21:29 #19
Okay tak for jeres svar alle sammen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester