Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
32 bit işaretli tamsayı negatif olduğunda, en yüksek biti bire eşittir. Bu 32 bit imzalı tamsayı 64 bitlik bir sayıya atandığında, yüksek bitler sıfıra ayarlanabilir (imzalanmamış tamsayı ve sayının onaltılık değeri korunarak) veya yüksek bitler bir olarak ayarlanabilir (sayının imzalı değeri korunarak). İkinci duruma işaret uzantısı denir.
Hata ayıklayıcısı MASM ifadelerinde, C++ ifadelerinde ve sayıları görüntülerken imzalama uzantısı için farklı kurallara uyar.
MASM İfadelerinde İşaret Genişletme
Belirli koşullar altında, sayılar MASM ifade değerlendiricisi tarafından otomatik olarak genişletilir . İşaret uzantısı yalnızca 0x80000000 ile 0xFFFFFFFF arasında sayıları etkileyebilir. Yani, işaret uzantısı yalnızca 32 bit olarak yazılabilen ve yüksek biti 1 olan sayıları etkiler.
Hata ayıklayıcı bunu 64 bit sayı olarak değerlendirdiğinde 0x12345678 sayısı her zaman 0x00000000 12345678 kalır. Öte yandan, 0x890ABCDE 64 bit değer olarak değerlendirildiğinde 0x00000000'890ABCDE olarak kalabilir veya MASM ifade değerlendiricisi bunu 0xFFFFFFFF'890ABCDE'ye genişletebilir.
0x80000000 ile 0xFFFFFFFF arasında bir sayı, aşağıdaki ölçütlere göre işaret genişletmesi yapılarak işlem görür.
Sayısal sabitler, kullanıcı modunda asla işaret genişletmesi yapılmaz. Çekirdek modunda, sayısal sabit, düşük bayttan önce bir vurgu ( ` ) içermediği sürece işaret genişletilir. Örneğin, çekirdek modunda, onaltılık sayılar EEAA1122 ve 00000000EEAA122 işaret genişletilmiştir, ancak 00000000'EEAA1122 ve 0'EEAA1122 değildir.
Her iki modda da 32 bit yazmaç genişletilebilir.
Sahte yazmaçlar her zaman 64 bit değer olarak depolanır. Bunlar değerlendirildiğinde işaret genişletilmez. Bir sahte yazmaca bir değer atandığında , kullanılan ifade standart C++ ölçütlerine göre değerlendirilir.
Bir ifadede, tek tek sayılar ve yazmaçlar işaret genişletilmesiyle uzatılabilir, ancak ifade değerlendirmesi sırasında başka hiçbir hesaplama bu şekilde genişletilmez. Sonuç olarak, aşağıdaki söz dizimini kullanarak bir sayının yüksek bitlerini maskeleyebilir veya kaydedebilirsiniz.
( 0x0`FFFFFFFF & expression )
C++ İfadelerinde İşaret Uzatması
Hata ayıklayıcı bir C++ ifadesini değerlendirdiğinde aşağıdaki kurallar geçerlidir:
Yazmaçlar ve sahte yazmaçlar hiçbir zaman işaret genişletilmez.
Diğer tüm değerler, türlerine göre C++'ta nasıl işleniyorsa aynen öyle işlenir.
Sign-Extended ve 64 Bit Sayıları Görüntüleme
32 bit ve 16 bit yazmaçlar dışında, tüm sayılar hata ayıklayıcının içinde 64 bit değerler olarak depolanır. Ancak, bir sayı belirli ölçütleri karşıladığında, hata ayıklayıcı bunu komut çıkışında 32 bitlik bir sayı olarak görüntüler.
Hata ayıklayıcı, sayıların nasıl görüntüleneceğini belirlemek için aşağıdaki ölçütleri kullanır:
Bir sayının yüksek 32 bitinin tümü sıfırsa (yani, sayı 0x00000000'00000000 ile 0x00000000'FFFFFFFF arasındaysa), hata ayıklayıcı sayıyı 32 bit sayı olarak görüntüler.
Bir sayının yüksek 32 bitinin tümü bir sayıysa ve düşük 32 bitin en yüksek biti de bir ise (yani, sayı 0xFFFFFFFF'80000000 ile 0xFFFFFFFF'FFFFFFFF arasındaysa), hata ayıklayıcı sayının işaretle genişletilmiş 32 bitlik bir sayı olduğunu varsayar ve 32 bit sayı olarak görüntüler.
Önceki iki koşul geçerli değilse (yani, sayı 0x00000001'00000000 ile 0xFFFFFFFF'7FFFFFFF arasındaysa) hata ayıklayıcı sayıyı 64 bit sayı olarak görüntüler.
Bu görüntüleme kuralları nedeniyle, bir sayı 0x80000000 ile 0xFFFFFFFF arasında 32 bitlik bir sayı olarak görüntülendiğinde, yüksek 32 bitin tümünün bir mi yoksa sıfırların tümü mü olduğunu doğrulayamazsınız. Bu iki durum arasında ayrım yapmak için, sayı üzerinde ek bir hesaplama gerçekleştirmeniz gerekir (örneğin, bir veya daha fazla yüksek biti maskeleme ve sonucu görüntüleme).