Kezdőoldal » Számítástechnika » Programozás » Bitműveleteknél unsigned...

Bitműveleteknél unsigned int-nél miért jön ki negatív szám? (C-ben)

Figyelt kérdés

#include <stdio.h>

unsigned int a = 60;

unsigned int b = 13;

unsigned int c = 0;


main()

{

c = a & b;

printf("c=%d\n", c);

c = a | b;

printf("c=%d\n", c);

c = a ^ b;

printf("c=%d\n", c);

c = b << 3;

printf("c=%d\n", c);

c = a >> 3;

printf("c=%d\n", c);

c = ~ a;

printf("c=%d\n", c);

system("pause");

}


A legutolsó műveletnél -61-et ad, holott szerintem ha a bitenkénti tagadást végezné akkor 195 kellene legyen.

Mi lehet a hiba?



2012. nov. 3. 12:44
 1/6 anonim ***** válasza:
100%
A %d helyett %u-t használj. A %d a signed decimal értékek kiírására van, a %u pedig az unsigned decimal-ra.
2012. nov. 3. 12:58
Hasznos számodra ez a válasz?
 2/6 iostream ***** válasza:

Ahogy az első válaszoló mondja. A printf nem végez típusellenőrzést, odaadsz neki valamit hogy nesze %d, akkor ő azt intként fogja értelmezni és kiírni, akármi is volt azelőtt. És mivel kettes komplemensű ábrázolást használ, a legmagasabb bit pedig a == 60 esetén 0, így a negálásával az 1 lesz, és negatív szám.


De mondjuk nem is értem, hogy hogy akarsz 195-t. Max akkor, ha sizeof(int) == 1, de az egy elcseszett platform akkor.

2012. nov. 3. 13:33
Hasznos számodra ez a válasz?
 3/6 A kérdező kommentje:
Köszönöm, a %-os kiiratásokat megértettem, de az utolsó eredmény csak nem passzol. Én onnan vettem, hogy 195 kellene legyen mikor 60-at tagad bitenként, mivel 60 = 0011 1100, ez tagadva pedig 1100 0011 = 195, de most meg 4294967235-öt hoz ki?!
2012. nov. 5. 12:26
 4/6 iostream ***** válasza:
Mint említettem, te azt feltételezed, hogy 8 bit egy int. Ez nem egy ésszerű feltételezés, a legtöbb architektúrán legalább 32 szokott lenni (ahogy nálad is).
2012. nov. 5. 12:49
Hasznos számodra ez a válasz?
 5/6 anonim ***** válasza:

" mivel 60 = 0011 1100"


Nem.

60= 0000 0000 0000 0000 0000 0000 0011 1100.

Ezt tagadd bitenként.

2012. nov. 5. 14:35
Hasznos számodra ez a válasz?
 6/6 A kérdező kommentje:
Értem, köszi, így már mindjárt más:)
2012. nov. 6. 12:29

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!