PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : basic_istream operator >>


Gast
2006-09-28, 08:46:46
Hallo,

ich hätte eine frage zum basic_istream operator >> (unsigned long&).
Laut MSDN gilt folgendes:

"If the converted value cannot be represented as the type of _Val, the function calls setstate(failbit). In any case, the function returns *this."

Ein Beispiel von mir sieht so aus:

#include <string>
#include <sstream>
#include <iostream>

int main(int, char**)
{
std::string number = "-50";
std::istringstream iss(number);

unsigned long num = 0;
iss >> num;

std::cout << iss.bad() << " " << iss.fail()
<< " " << iss.good() << " " << iss.eof()
<< std::endl;

return 0;
}

Meiner Meinung nach ist "-50" kein gültiger unsigned long, daher müsste theoretisch das failbit gesetzt werden, wird es allerdings nicht, es ist nur das eof bit gesetzt. Der Wert von num nach dem operator >> ist 0xffffffce.

Danke für eure Ratschläge.

lg,
Stefan

P.S.: Ich hab es mit MSVC 6.0 und MSVC 8.0 (aka Visual Studio .NET 2005) getestet.

gentoo
2006-09-28, 09:24:42
Das Problem ist, dass der Prozessor versucht die -50 auf eine
unsigned variable zuzuweisen.
Praktisch gesehen schaut es so aus:

unsigned long ist 32-bit lang ergo max-wert = 0xFFFFFFFF ( = (2^32) - 1)
Da du nur einen definierten Speicherbereich hast, ist 0-1 0xFFFFFFFF
und daher 0-50 0xffffffce.

Umgekehrt ist es natürlich auch so, wenn du zum max-wert 1 dazu addierst
bist du wieder bei 0.

Um dies zu verhindern suche im string nach einem minuszeichen.

Gast
2006-09-28, 09:41:32
Das Problem ist, dass der Prozessor versucht die -50 auf eine
unsigned variable zuzuweisen.
Praktisch gesehen schaut es so aus:

unsigned long ist 32-bit lang ergo max-wert = 0xFFFFFFFF ( = (2^32) - 1)
Da du nur einen definierten Speicherbereich hast, ist 0-1 0xFFFFFFFF
und daher 0-50 0xffffffce.

Umgekehrt ist es natürlich auch so, wenn du zum max-wert 1 dazu addierst
bist du wieder bei 0.

Um dies zu verhindern suche im string nach einem minuszeichen.

Servus gentoo,

danke aber mit bit schupferei kenn ich mich aus).
Ich hab mir allerdings gedacht, dass der operator >> so intelligent ist, dass er checkt dass der string allerdings ein signed Zeichen hat '-'. Ergo kann ein solcher string nicht in eine unsigned variable extrahiert werden, ergo sollte das fail bit gesetzt werden. Aber g++ und MSVC verhalten sich ident, also bleibt mir keine andere Wahl als selbst zu checken ob das erste zeichen ein minus ist.

BTW:
unsigned long ist auf einem x86 32 bit auf einem amd64 64 bit (sofern ein entsprechender compiler verwendet wird).

lg,
Stefan

P.S.:
@gentoo Wennst der gentoo bist, den ich kenn, wollt ich noch fragen hast Zeit für an Kaffee in Unterpremstätten?

gentoo
2006-09-28, 09:53:17
seas stefan, du als alter c++ guru solltest des aber wissen ;)

Heut am Nachmitag schau ich mal auf a kaffeetscherl vorbei:biggrin:

gentoo
2006-09-28, 09:57:04
P.s.: Den Tipp mit dem Minuszeichen hast übrigens du mir gegeben,
nachdem wir bei SVU schon einmal troubles mit istringstream hatten. ;)

Gast
2006-09-28, 10:23:04
unsigned long ist auf einem x86 32 bit auf einem amd64 64 bit (sofern ein entsprechender compiler verwendet wird).

Achtung! Mit VC++ ist das nicht der Fall. int und long bleiben 32-Bit auch wenn man das Program für x64 kompiliert.

Gast
2006-09-28, 13:07:35
Achtung! Mit VC++ ist das nicht der Fall. int und long bleiben 32-Bit auch wenn man das Program für x64 kompiliert.

Hi,
danke für den Hinweis, habs grad ausprobiert.

lg,
Stefan