Uyarı için teşekkür Erdem. :)
Alıntı (erdem):
> Herhalde yeni başlayanların kafası karışmasın diye ondalık olarak gösterdiniz.
Doğru. O noktaya kadar tamsayı değerden başka bir şey bilmiyoruz.
Alıntı:
> O zaman
> 0 97 2 86
> ```
> Ya da onaltılık sistemde:
>
> 0 61 1 1E
> demek istediniz sanırım.
Değil: 286 değeri 255'ten büyük olduğu için iki bayt olarak saklanır: Üst bayt 1, alt bayt 30 olarak. (30, "286 eksi 256"dan geliyor).
Alıntı:
> Aslında "bazılarının gerçek değerleri farklıdır" demişsiniz ama yukarda Ğ harfinin Unicode'daki değeri 286'dır ifadesini okuyunca çoğu kişi bu 130 nerden geldi diye düşünebilir.
Ben 1 ve 30 diye iki farklı değer olarak göstermek istemiştim. 130 olarak algılanacağı aklıma gelmemişti. Düzelteceğim. :)
'Ğ'w, gerçekten de bellekte 1 ve 30 değerleri olarak durur. (Sonculluk (endianness) nedeniyle 30 ve 1 olarak da durabilir.)
Göstergeler dersinde nesnelerin bellekte nasıl durduklarını gösteren iki işlev yazmıştım:
http://ddili.org/ders/d/gostergeler.html
Onları biraz geliştirdim. Sonuçta aşağıdaki program istediğiniz nesnenin bellekteki baytlarını gösterir:
import std.stdio;
import std.traits;
import std.ctype;
/**
* Belirtilen adresteki belirtilen sayıdaki baytı gösterir
*/
void belleğiGöster(T)(T * bellek, size_t uzunluk, string girinti = "")
{
const ubyte * baş = cast(ubyte*)bellek;
foreach (i; 0 .. uzunluk) {
const ubyte * adres = baş + i;
const char karakter = isprint(*adres) ? *adres : '.';
writefln("%s%s: %02x (% 3d) %s",
girinti, adres, *adres, *adres, karakter);
}
}
/**
* Belirtilen değişkenin bellekteki baytlarını gösterir.
*
* Dizi türlerinde ayrıca dizi elemanlarını oluşturan baytları da gösterir.
*/
void baytlarınıGöster(T)(ref T değişken)
{
const ubyte * baş = cast(ubyte*)&değişken; // (1)
writefln("tür : %s", T.stringof);
writefln("değer : %s", değişken);
writefln("adres : %s", baş); // (2)
writef( "baytlar: ");
foreach (bayt; baş .. baş + T.sizeof) { // (3)
writef("%02x ", *bayt); // (4)
}
writeln();
static if (isArray!T) {
writeln("elemanlar:");
/*
* Bu adet, dizgilerde daha fazla da olabilir; tembellik ediyor ve tam
* doğru olarak hesaplamıyoruz. Tam doğru olması için std.utf.count ve
* std.utf.codeLength'ten de yararlanmak gerekirdi.
*/
size_t uzunluk = değişken.length * typeof(değişken[0]).sizeof;
belleğiGöster(değişken.ptr, uzunluk, " ");
}
writeln();
}
void main()
{
double d = 1.25;
baytlarınıGöster(d);
baytlarınıGöster("aĞ"w);
}
1.25 gibi hazır değerler işleve 'ref' nedeniyle doğrudan gönderilemiyorlar. O yüzden açıkça 'd' gibi bir değişken tanımlamak zorunda kaldık.
Bendeki çıktısı şöyle:
'tür : double
değer : 1.25
adres : 7FFF32E84318
baytlar: 00 00 00 00 00 00 f4 3f
tür : immutable(wchar)[]
değer : aĞ
adres : 49DEC0
baytlar: 02 00 00 00 00 00 00 00 b0 de 49 00 00 00 00 00
elemanlar:
49DEB0: 61 ( 97) a
49DEB1: 00 ( 0) .
49DEB2: 1e ( 30) .
49DEB3: 01 ( 1) .
'
Görüldüğü gibi ben küçük soncul (little endian) bir ortamdayım: baytlar bellekte 30 1 sırasıyla duruyorlar. (Intel işlemcileri küçük sonculdur.)
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]