Toon posts:

[C++] convert unsigned short naar int

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

In c++ is het mogelijk om een char * om te zetten naar een int dmv de functie atoi().
Is het ook mogelijk om een unsigned short naar een int om te zetten?

(I'm just a beginner :+)

  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
Gewoon met een normale type-cast:
code:
1
2
unsigned short usShort = 100;
int     iInt = (int)usShort;

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

frozeneagle
unsigned short naar een int
een unsigned short is een int. Bedoel je van een unsigned short naar een signed short, of naar een unsigned long of...

Maar goed, ik neem aan dat je simpelweg het fenomeen typecasting bedoelt:
code:
1
2
3
4
type1 oudevar;
type2 nieuwevar;

nieuwevar = ( type2 ) oudevar;

oftewel
code:
1
2
3
4
int      nieuwevar;
unsigned short  oudevar;

nieuwevar = ( int ) oudevar;

edit:
* drm moet zijn reactieschermpjes niet open laten staan maar op verstuur drukken |:(

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
Bedankt tot nu toe, maar ik heb nog steeds mijn probleem niet opgelost. Ik moet nl de tijd en de datum krijgen in c++. Hierbij gaf visual studio de fout cannot convert from unsigned short to int. Vandaar mijn vraag.
Maar ik moet het denk ik anders aanpakken. Ik heb het volgende programma:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
timer.h
#include <windows.h>

typedef struct _USERTIME {  
    WORD wYear; 
    WORD wMonth; 
    WORD wDayOfWeek; 
    WORD wDay; 
    WORD wHour; 
    WORD wMinute; 
    WORD wSecond; 
    WORD wMilliseconds; 
} USERTIME; 


class Timer{
private:
    _SYSTEMTIME systemtime; 
    _USERTIME begintime;
    _USERTIME endtime;
    
    
    
public:
    Timer();
    void StartTime();
    void StopTime();
    int GetTime();
        
};

en
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
timer.cpp
#include "Timer.h"

Timer::Timer() { }

void Timer::StartTime()
{
    GetLocalTime(&this->systemtime);
    this->begintime.wDay = this->systemtime.wDay;
    this->begintime.wDayOfWeek = this->systemtime.wDayOfWeek;
    this->begintime.wHour  = this->systemtime.wHour;
    this->begintime.wMilliseconds  = this->systemtime.wMilliseconds;
    this->begintime.wMinute = this->systemtime.wMinute;
    this->begintime.wMonth = this->systemtime.wMinute;
    this->begintime.wSecond = this->systemtime.wSecond;
    this->begintime.wYear = this->systemtime.wYear;
}

void Timer::StopTime()
{
    GetLocalTime(&this->systemtime);
    this->endtime.wDay = this->systemtime.wDay;
    this->endtime.wDayOfWeek = this->systemtime.wDayOfWeek;
    this->endtime.wHour  = this->systemtime.wHour;
    this->endtime.wMilliseconds  = this->systemtime.wMilliseconds;
    this->endtime.wMinute = this->systemtime.wMinute;
    this->endtime.wMonth = this->systemtime.wMinute;
    this->endtime.wSecond = this->systemtime.wSecond;
    this->endtime.wYear = this->systemtime.wYear;
}

int Timer::GetTime()
{
    return this->begintime.wDay;
}

als laatste:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
test.cpp
#include <iostream.h>
#include <string.h>
#include "Timer.h"

int main(void)
{
    Timer tm;
    char * tekst;
    
    tm.StartTime(); 
    cout << "Dos proces is gestart\n";
     
    
    itoa(tm.GetTime(), tekst,10);
    cout << tekst << endl; 

    

    return 0;
}

ik wil graag van de waarde die tm.GetTime() returned een char * maken (dit wil ik gebruiken voor een msgbox). Maar bij het gebruik van de functie itoa treedt er een ongeldige bewerking op. Ook al gebruik ik een cast naar een int. Weten jullie hoe ik van de waarde een char * kan maken?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

ah op die fiets. int as in pointer ;)

Tja, ik ben wel fan van de sprintf () functie. Leer hem en beheers de wereld van string-formatten :D

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
Ik heb er nu deze regel aan toegevoegd:
code:
1
sprintf(tekst, "tekst: %n", tm.GetTime());

Maar er treedt nog stees een ongeldige bewerking op (ook als ik %n weghaal).
Hoe krijg ik het nu voor elkaar om die datum naar een char * te krijgen?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

wat is de struct definitie van _SYSTEMTIME ?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
Uit de help van BCB5:
code:
1
2
3
4
5
6
7
8
9
10
typedef struct _SYSTEMTIME {  // st  
    WORD wYear; 
    WORD wMonth; 
    WORD wDayOfWeek; 
    WORD wDay; 
    WORD wHour; 
    WORD wMinute; 
    WORD wSecond; 
    WORD wMilliseconds; 
} SYSTEMTIME;

  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
code:
1
sprintf(tekst, "tekst: %n", tm.GetTime());

Moet zijn:
code:
1
sprintf(tekst, "tekst: %d", tm.GetTime());

Je kunt natuurlijk ook doen:
code:
1
cout << "tekst: " << tm.GetTime() << endl;

  • mvdejong
  • Registratie: Juni 2000
  • Laatst online: 29-11-2024

mvdejong

When does the hurting stop ?

De reden waarom de compiler weigert een unsigned short naar een int om te zetten is de ranges :
unsigned short (2 bytes) : 0 - 65535
int (signed, 2 bytes) -32768 - 32767
Ongeveer de helft van het bereik van de unsigned short is niet betrouwbaar om te zetten.

The number of things that Arthur couldn't believe he was seeing was fairly large


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

even voor de duidelijkheid: de reden dat ik sprintf aandroeg was omdat ik dacht de datum geformat moest worden in een string. Niet om een integer op stdout weer te geven. ;)
MrHuge
Uit de help van BCB5
Die heb ik hier niet helaas ;) En zo wel, dan had ik geen zin gehad het op te zoeken :+

frozeneagle >

Waar wordt er nou precies gepoogd om een unsigned short naar int om te zetten? Geeft de compiler dat aan, of houdt de compiler zijn mond en gaat het bij uitvoeren fout?

edit:
als ik 't goed lees in de functie itoa.

wat als je die regel met itoa weghaalt en je probeert gewoon
code:
1
cout << "tekst: " << tm.GetTime() << endl;

zoals MrHuge al zei?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
De compiler zegt nu niets. Bij het uitvoeren treedt er een fout op.
Verder is de regel
code:
1
cout << "tekst: " << tm.GetTime() << endl;

niet mogelijk, omdat ik de waarde van de funcite tm.GetTime() wil gebruiken om een messagebox van tekst te voorzien. Een messagebox heeft altijd een char * als argument. Dus vandaar.

Verwijderd

Topicstarter
Dit is alleen maar een testprogramma. Ik wil het uiteindelijk in een windowsapp gebruiken

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

frozeneagle:
Verder is de regel
code:
1
cout << "tekst: " << tm.GetTime() << endl;

niet mogelijk,
Dat heet nou jezelf voorzien van debug-informatie ;) welkom in de cursus debuggen.
Stap 0
erachter komen wat de fout veroorzaakt ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • GarBaGe
  • Registratie: December 1999
  • Laatst online: 08:55
Op vrijdag 24 mei 2002 12:19 schreef mvdejong het volgende:
De reden waarom de compiler weigert een unsigned short naar een int om te zetten is de ranges :
unsigned short (2 bytes) : 0 - 65535
int (signed, 2 bytes) -32768 - 32767
Ongeveer de helft van het bereik van de unsigned short is niet betrouwbaar om te zetten.
een int is toch 4 bytes (op 32-bit computers) ??

Ryzen9 5900X; 16GB DDR4-3200 ; RTX-4080S ; 7TB SSD


  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
Op vrijdag 24 mei 2002 12:43 schreef GarBaGe het volgende:
een int is toch 4 bytes (op 32-bit computers) ??
Op 32 bit pc's:

int = 32 bits signed
unsigned short = 16 bits unsigned
Op vrijdag 24 mei 2002 11:09 schreef drm het volgende:
een unsigned short is een int.
Dit is dus onjuist!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

MrHuge:
Dit is dus onjuist!
Laat ik het anders zeggen. Een unsigned short is van het type int.

Er is namelijk geen verschil tussen
code:
1
2
unsigned short  a;
unsigned short int  b;

dat bedoelde ik. Maar het zou me overigens niet verbazen wanneer ook dit weer compiler en/of platform afhankelijk is...

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • mvdejong
  • Registratie: Juni 2000
  • Laatst online: 29-11-2024

mvdejong

When does the hurting stop ?

Op vrijdag 24 mei 2002 12:43 schreef GarBaGe het volgende:

[..]

een int is toch 4 bytes (op 32-bit computers) ??
Dat hangt helemaal van de compiler, plus eventuele compilatie-opties, af.
De enige garantie die je hebt is : short int <= int <= long int
Meestal, maar ook nog niet altijd, is op een 32-bit systeem een short 16 en een long 32, maar ook daar heb ik afwijkingen in gezien. Sommige compilers op RISC-systemen hebben als default short = int = long, omdat 16-bits rekenen echt traag gaat, dat moet je met compiler-opties afdwingen.

The number of things that Arthur couldn't believe he was seeing was fairly large


  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
Op vrijdag 24 mei 2002 13:32 schreef mvdejong het volgende:

[..]

Dat hangt helemaal van de compiler, plus eventuele compilatie-opties, af.
De enige garantie die je hebt is : short int <= int <= long int
Klopt, als je Borland C++ Builder en MS Visual C++ vergelijkt, dan is het op het niveau van int/short wel hetzelfde, maar als je naar double/long enzo kijkt, dan loopt het toch wel uit elkaar :(

Raar dat daar eigenlijk geen standaard voor is afgesproken...

Het is natuurlijk zo dat je dit soort dingen voor een programmeertaal niet kunt gaan vastleggen, maar voor een bepaald platform zou dat toch wel moeten kunnen lijkt mij zo...

  • The End
  • Registratie: Maart 2000
  • Laatst online: 07:14

The End

!Beginning

Om het leuker te maken:
Als je UNICODE definieerd in je project, dan is een unsigned short een character....

  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
Op vrijdag 24 mei 2002 14:21 schreef The End het volgende:
Om het leuker te maken:
Als je UNICODE definieerd in je project, dan is een unsigned short een character....
Klopt, maar dat verandert niks aan het aantal bits wat een unsigned short beslaat (in geval van win32)...

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21:50
Op vrijdag 24 mei 2002 14:21 schreef The End het volgende:
Als je UNICODE definieerd in je project, dan is een unsigned short een character....
Het lijkt me meer dat characters 'wide' zijn en dus uit twee bytes bestaan; toevallig evenveel als shorts. Het type (unsigned) short zelf veranderd natuurlijk niet.

  • The End
  • Registratie: Maart 2000
  • Laatst online: 07:14

The End

!Beginning

Op vrijdag 24 mei 2002 14:28 schreef Soultaker het volgende:

[..]

Het lijkt me meer dat characters 'wide' zijn en dus uit twee bytes bestaan; toevallig evenveel als shorts. Het type (unsigned) short zelf veranderd natuurlijk niet.
nee, maar als je dan een USHORT naar een int gaat casten, krijg je (hoogst) waarschijnlijk niet het gewenste resultaat...
Pagina: 1