Ha egy unsigned változóba például -3as értéket másolok, akkor annak az értéke +3 vagy 0 lesz?
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
C-ben kettes komplemensként lesz tárolva. Ha utána unsignedként pl. kiiratod, akkor egy jó nagy számot kapsz (4294967293). Ha signed-ként iratod ki, akkor -3 -mat.
#2-es, még csak warningot se kaptam fordítás során.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
"#2-es, még csak warningot se kaptam fordítás során."
Lol
Éppen ez a baj.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
4-es
Ott std::cout-tal kiiratva ugyanazt a nagy számot kaptam (kettes komplemens miatt), csak itt nem kell megadnom a kiíratásnál a típust (c-nél a printf-nél meg kell).
Egyébként az ilyen dolgokat simán tudod tesztelni, pl. erre a kérdésre ennyi kóddal néztem meg:
#include <iostream>
int main() {
unsigned int n = 0;
n=-3;
std::cout << n << std::endl;
return 0;
}
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
Ha egyébként castolod signed-ra, akkor megint -3 lesz
std::cout << (signed)n << std::endl;
Ennek az az oka, hogy a signed, meg unsigdned csak azt mondja meg, hogy hogy kell kezelni az adott memória területet, de egyébként meg ugyanúgy van tárolva a háttérben. Ha jobban érdekel, akkor a kettes komplemensnek nézz utána
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
Annyi a történet, hogy a sign konverzióra vonatkozó warn-ok alapértelmezés szerint le vannak tiltva. Legalábbis a C++ esetében.
Szóval, ott van a warning, csak be kell kapcsolni.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!