C'de onluk sayıyı onaltılık görünüme çevirme

Başlatan mcn, 12 Aralık 2011, 13:34:52

mcn

Herkese merhaba,

İşlemci programlama da kullandığımız C dilinde;(yanlış bir tabir kullanmış olabilirim)

onluk sistemde bir sayımız var diyelim.

x=21;

Burada x değişkenimizin değeri 21 olsun.

Bu değişkenin içeriğini onaltılık sisteme çevirmek istiyorum.Ancak 21 sayısının onaltılık sistemdeki karşılığına değil.
Direk değişkenin içeriğini  "0x21" haline dönüştürmek istiyorum.
Yani yaptığımız işlem sonucunda

x=0x21; olsun istiyorum.

Bu çevirme işlemini nasıl gerçekleştirebiliriz.

Şimdiden teşekkürler.

www.teknikyazi.com --üşenme,erteleme,vazgeçme...

justice_for_all

#1
sayinizi ayirin ornegin 21 sayisini 2x10 + 1x1 die sonra 10 gordugunuz yere 16 yazarak carpin sonuc istediginiz gibi olacaktir.daha sonra buldugunuz sayinin hex karsiligi 0x21 olur.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Klein



0x21 değerinin  karşılığı 33 dür.

elimizde bir değişken var. x.
x = 21;

dönüşüm yaptıktan sonra
x=33;

istediğiniz bu mu?

justice_for_all

Alıntı yapılan: Klein - 12 Aralık 2011, 14:03:41

0x21 değerinin  karşılığı 33 dür.

elimizde bir değişken var. x.
x = 21;

dönüşüm yaptıktan sonra
x=33;

istediğiniz bu mu?

sanirim istedigi 21 sayisini 0x21 yapmak hocam
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Klein

Alıntı yapılan: justice_for_all - 12 Aralık 2011, 14:05:56
sanirim istedigi 21 sayisini 0x21 yapmak hocam
21 sayısını 0x21 yapmak diye bir şey olamaz ki. 21sayısını 0x21 yapmak ile 21 sayısını 33 yapmak aynı şey.

Ancak 21 sayısı 0x21 şeklinde görünecek bir stringe çevrilebilir. Ama bu string x diye tek bir değişken olamaz. Ancak bir dizi olur
Bu yüzden soruyu tam olarak anlayamadım.

yamak

#5
Tam olarak ne demek istediğinizi anlamadım ama aşağıdaki kod işinizi görür umarım.
Dec c++ derleyicisinde yazdığım kodu veriyorum. Ama arm,pic... derleyicilerinde çalışır mı emin değilim?
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main(void)
{
    int i;
    char buffer1[10];
    printf("bir sayi gir:\n");
    scanf("%d",&i);
    itoa(i,buffer1,16);
    printf("sonuc=%s\n",buffer1);
    sprintf(buffer2,"0x%s",buffer1);
    printf("sonuc2=%s",buffer2);
    getch();  
}

Ekleme: Keil'da denedim itoa komutunda hata veriyo.Çok uğraşmadım belki kullanmanın bi yolu vardır. itoa nın yapacağı şeyi siz matematiksel olarak da yapabilirsiniz. Burdan çıkan sonucu da yine sprintf komutu ile 0x21 şeklinde bir dize atabilirsiniz.Eğer direkt 21 0x21 yapmak istiyosanız o zaman sorun yok zaten sprintf(buffer,"0x%d",i)komutu bu işlem için yeterli.Burada i=21,buffer da dizinin ismi.

mcn

Hocam şimdi,

21 sayısını 0x21 şeklinde görünür hale getirmek istiyorum.onaltılık sistemdeki karşılığını almak değil amacım.
Elimde bir dizi var.

unsigned char DIZI[7]={0x00,0x25,0x19,0x27,0x07,0x03,0x11};

Bu dizinin diyelim ki,1. elemanı olan 0x25 i alalım ve x değişkenine atalım.

x=DIZI[1];

burada x=25; değerini alıyor.

sonra istiyorum ki bu değeri arttırayım.

x++;
dedim ve x değeri 26 oldu.

şimdi bu değeri,

DIZI[1]=x;

dediğim zaman dizinin 1. elemanı 26 olmuş oluyor.

Ve bu şekilde kullandığım entegreye o dizi değerini yolladığımda kabul etmiyor.Yani entegre(DS1302) 0x26 nın 26 değerini alıp dakika olarak kaydediyor.
Dizi değerini tekrardan 0x26 şeklinde o diziye kaydetmeliyim.
Şimdi daha açık oldu sanırım ama garip bir durum,mümkün müdür böyle birşey,benim de kafam karıştı  :o
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

justice_for_all

sizin demek istediginiz sanirim desimal sayinin aynisin hexadesimale cevirmek degilmi hocam yani desimal sayi 25 olsun bunun 0nlar basamagini 16 ile carp birler basamaginiga 1 ile carp topla sonucu hexe cevir sonuc 0x25 olur.daha sonra sayiyi 1 arttir desimal 26 oldu yukaridaki islemi tekrarla hex sayi 0x26 olur anlamismiyim sizi?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

saucompeng

#8
x=(x/10)*16+(x-(x/10)*10)
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

Kabil ATICI

Aslında sorunun cevabını vermiş gibisin. diziye sayının karşılığı hex ,

hex(99)=(0x00,0x01...0x19,0x20,0x21...0x99)
şeklinde.

sonuçta burada  hex(22)=0x22 olur.

dizi[1]=hex[22]  olabilir mi?

ambar7

bocek

unsigned char DIZI[7]={0x00,0x25,0x19,0x27,0x07,0x03,0x11};


burada rakamların önündeki '0x' leri kaldır olsun bitsin.

C'de rakamların gösterimi için çeşitli seçenekler sunulmuştur.
örneğin onluk sistemde x=21 sayısın programda şu şekillerde gösterebiliriz:
x = 21;  // onluk sayı sisteminde kullanım
x = 0x15; // 16'lık sayı sisteminde kullanım
x = 10101b; // ikilik sayı sisteminde kullanım
x= 025; // 8'lik (octal) sayı sisteminde kullanım (önüne 0 (sıfır) koyuyorsun ama hiç kullanan görmedim).

bunların hepsi de aynı anlama gelir.
anladığım kadarıyla sen zaman bilgislerini DIZI değişkenine onluk sayı sisteminde yazıp bunu ilk değer olarak saat entegresine yollamak istiyorsun. Ancak sayıların önüne 0x eklediğin için program bunu 16'lık sayı sisteminde algılıyor ama sen aslında 10'luk sistemdeki rakamı yazıyorsun.
umarım doğru anlamışımdır.
sen en iyisi 0x'leri hiç karıştırma direkt onluk sistemdeki değerleri yaz:
unsigned char DIZI[7]={0,25,19,27,07,03,11};
1 ya da 0. işte 'bit'ün mesele..

justice_for_all

Alıntı yapılan: bocek - 12 Aralık 2011, 14:56:18
anladığım kadarıyla sen zaman bilgislerini DIZI değişkenine onluk sayı sisteminde yazıp bunu ilk değer olarak saat entegresine yollamak istiyorsun. Ancak sayıların önüne 0x eklediğin için program bunu 16'lık sayı sisteminde algılıyor ama sen aslında 10'luk sistemdeki rakamı yazıyorsun.

hocam arkadasin kullandigi entegre hex olarak kabul ediyo diye biliyorum yani 10 luk sayiyi hexe ayni degerde cevirmesi gerek ki zaman degeri degismesin
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

justice_for_all

Alıntı yapılan: mcn - 12 Aralık 2011, 14:30:20


Ve bu şekilde kullandığım entegreye o dizi değerini yolladığımda kabul etmiyor.Yani entegre(DS1302)

konuyu acana arkadas kendisi demis entegre die.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

mcn

ilk olarak konuyu yanlış yere açmışım sanırım,sorun C ile ilgili diyerek bu başlık altına açmıştım.

Görevli arkadaşlar daha uygun bir  bölümüne taşırlarsa konuyu sevinirim.

MSP430 ile yapılan bir saat uygulamasında da DS1302 nin bu durumundan bahsedilmiş.

http://www.mcu-turkey.com/?p=16536

Alıntı YapBu arada şundan da bahsetmeliyimki, entegre içerisindeki datalar hex olarak saklanıp decimal olarak yorumlanırlar. Örnek olarak şöyle söyleyelim. Mesela saniye değeri o an hexadecimal olarak 0×34 olsun. Decimal olarak bu değer 52 ye karşılık gelmektedir. Ancak bu böyle yorumlanmaması gerekir. Saniye değeri o an 0×34 değeri olarak okunuyorsa saniye değeri o an gerçek olarak 34 tür. Bu nedenle DS1302 ye data gönderilirken ve alınırken bu durum gözardı edilmemelidir. Bu durum nedeniylede yazılımda Convert_Dec() isimli bir altprogram kullanılmaktadır.

saucompeng in vermiş olduğu " x=(x/10)*16+(x-(x/10)*10) " şu formülü uygulayınca sorun çözüldü.

Burada sayı decimal e çevriliyor.entegre  onu registerlarına tekrar kendisi hex olarak kaydediyor.Yani diyelim ki,
x=23;

bunu şu formülle  x=(x/10)*16+(x-(x/10)*10)  decimale çevirdik.burada değer 35 çıkıyor.Sonrasında bu 35 sayısını diyelimki 1 arttırdım 36 oldu.Bunu bu şekilde DS1302  ye gönderiyorum.Ancak DS1302 bu değeri 0x24 olarak alıyor ve bu değer dakikaysa örneğin dakikayı 23 den 24 e ayarlamış oluyoruz.Sorumu karmaşık sormuşum biraz.Halbuki çözüm karşımdaymış.
Yardımcı olan herkese teşekkürler,özellikle de sana saucompeng.

www.teknikyazi.com --üşenme,erteleme,vazgeçme...

saucompeng

Alıntı yapılan: mcn - 12 Aralık 2011, 16:05:19
ilk olarak konuyu yanlış yere açmışım sanırım,sorun C ile ilgili diyerek bu başlık altına açmıştım.

Görevli arkadaşlar daha uygun bir  bölümüne taşırlarsa konuyu sevinirim.

MSP430 ile yapılan bir saat uygulamasında da DS1302 nin bu durumundan bahsedilmiş.

http://www.mcu-turkey.com/?p=16536

saucompeng in vermiş olduğu " x=(x/10)*16+(x-(x/10)*10) " şu formülü uygulayınca sorun çözüldü.

Burada sayı decimal e çevriliyor.entegre  onu registerlarına tekrar kendisi hex olarak kaydediyor.Yani diyelim ki,
x=23;

bunu şu formülle  x=(x/10)*16+(x-(x/10)*10)  decimale çevirdik.burada değer 35 çıkıyor.Sonrasında bu 35 sayısını diyelimki 1 arttırdım 36 oldu.Bunu bu şekilde DS1302  ye gönderiyorum.Ancak DS1302 bu değeri 0x24 olarak alıyor ve bu değer dakikaysa örneğin dakikayı 23 den 24 e ayarlamış oluyoruz.Sorumu karmaşık sormuşum biraz.Halbuki çözüm karşımdaymış.
Yardımcı olan herkese teşekkürler,özellikle de sana saucompeng.

Yardımcı olduysam ne mutlu kardeşim , iyi çalışmalar...
www.teknikyazi.com --üşenme,erteleme,vazgeçme...