2017-08-12 1 views
0

Aujourd'hui Quand j'ai débogué, utilisez gdb. J'ai découvert quelque chose de vraiment étrange:gdb sur linux n'utilise pas le complément 2

print 0xC0 //192, correct 
print (char)0xC0 //-64 

ne utilise pas d'ordinateur complément à 2 pour représenter des nombres négatifs (ce qui est évidemment pas ce cas) ou je manque quelque chose de fondamentalement?

Répondre

2

Non, cela utilise certainement le complément à deux, le fait que votre char casting (et, dans cette mise en œuvre, char est évidemment signé) vous donne -64 est la preuve.

Je pense que vous pourriez juste mal comprendre ce que gdb fait à votre valeur d'entrée 0xc0. Très probablement, il chargera cela dans un type de données plus large que huit bits, sans en supposant qu'il doit prolonger la signature d'une valeur de huit bits.

Par conséquent, lorsque vous imprimez 0xc0, il est traité comme quelque chose comme 0x000000c0, très bien un nombre positif dans le complément à deux. Lorsque vous déclarez explicitement qu'il doit être traité comme [signed] char, il imprime la variante négative.

+0

Je comprends ce que vous voulez dire, mais quand je regarde de plus près. C'est juste par hasard que '-64' dans le complément à 2 est exactement le même que' -64' dans la représentation binaire signée. Quand je regarde d'abord '-64', j'ai immédiatement pensé à' 1100 0000' avec le premier bit étant le signe, ce qui n'est pas le complément de 2 mais plus familier à l'humain. Alors c'est exactement '192' (surprise?). Maintenant je reste en arrière et je calcule '-64' en complément de 2, tout va bien, une telle coïncidence m'a étonné – AtheS21