Long (32 bit) turundekı degişkenden int(8 bit) değişkenine atama yapma

Başlatan universitelim54, 11 Mayıs 2019, 17:35:22

universitelim54

Mrb. Arkadaslar long turunde bir degişkenim var degişken 1 adında birde uin8_t türünde değişkenim var 8 bit ismi degişken 2

degişken1 parcalaryarak 8 bit halinde diğer değişkene atamak istiyorum ancak yazılım hata veriyor.

degisken2 = degişken1 << 8;

şeklinde denedim olmadı. konu ile ilgli yardımınızı rica ederim.

Tagli

Ne yapmak istediğini anlamadım. Long zaten uint8_t'ye sığmaz. Bir bölümünü kesip alabilirsin ancak, artık neresini almak istiyorsan. Tam olarak ne yapmak istiyorsun?
Gökçe Tağlıoğlu

sigmoid


ByTEK

"C type casting" konusunu inceleyin. Tip dönüşümleri icin kullanılır.

universitelim54

Alıntı yapılan: Tagli - 11 Mayıs 2019, 21:22:11Ne yapmak istediğini anlamadım. Long zaten uint8_t'ye sığmaz. Bir bölümünü kesip alabilirsin ancak, artık neresini almak istiyorsan. Tam olarak ne yapmak istiyorsun?

lon dediğin gibi 32 bit bunu 4 eş parcaya bolerek int turunde olusturdugum diziye atamak istiyorum . örnek olarak

int dizi[3];

dizi[1]=longdegişkenin ilk 0-8 bitleri
dizi[2]=longdegişkenin ilk 8-16 bitleri
dizi[3]=longdegişkenin ilk 16-24 bitleri
dizi[4]=longdegişkenin ilk 24-32 bitleri

bunu yapmak istiyorum 

ByTEK

Alıntı yapılan: universitelim54 - 11 Mayıs 2019, 23:02:46lon dediğin gibi 32 bit bunu 4 eş parcaya bolerek int turunde olusturdugum diziye atamak istiyorum . örnek olarak

int dizi[3];

dizi[1]=longdegişkenin ilk 0-8 bitleri
dizi[2]=longdegişkenin ilk 8-16 bitleri
dizi[3]=longdegişkenin ilk 16-24 bitleri
dizi[4]=longdegişkenin ilk 24-32 bitleri

bunu yapmak istiyorum 


https://stackoverflow.com/questions/3133376/implicit-typecasting-in-c-converting-32-bit-unsigned-in-to-8-bit-u-int


devrecii

dizi[0]=(longdegisken) & 0xFF;
dizi[1]=(longdegisken >> 8) & 0xFF;
dizi[2]=(longdegisken >> 16) & 0xFF;
dizi[3]=(longdegisken >> 24) & 0xFF;

Yuunus


universitelim54

program cıktısı

programı denildiği şekliyle duzenledım..

unsigned long Degerlong =12345678;

seri porttan okudugum deger:

     Data[0]=78
     Data[1]=97
     Data[2]=63
     Data[3]=0
bir turlu dogru sayıları alamıyorum. yada bişeyi gozden kacırıyorum


devrecii

Sen ondalık sistem istiyorsun,  temeliniz sağlam değil  :P bence sıfırdan bi  c/c++ kitabı okuyun derim 

dizi[0]=(longdegisken) %100;
dizi[1]=(longdegisken /100) %100;
dizi[2]=(longdegisken /10000) %100;
dizi[3]=(longdegisken /1000000) %100;

universitelim54

iboibo ... Teşekkür ederim  denedim dogru sonucu veriyor. bazen çok farklı noktalara takılabiliyorum. mod ile çözeceği düşündüm ancak bit bit kaydırmak daha mantıklı gelmişti. kafa oraya takılı kaldı teşekkür ederim tüm arkadaslara yardımlarından dolayı

RaMu

@universitelim54 soru yani konu önemli ve temel bir konu,
bence hazır yakalamışken üzerine düş.

Sence neden kaydırmayla olmadı, neden bölmeyle kalanla oldu,
nerede yanlış var?

Bu arada konu aslında "taban aritmetiği"
bilgisayarda her şey 1 ve 0 dan ibaret dediğimiz nokta ve
insanın 10 parmağının bilgisayarın 2 parmağının olması.
Bir ara 12 parmağı olan düzine diye bir kelimeyi,
12-24 saati, 60 dakikayı bize miras bırakan insanlarda var.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

z

Long int degisken (32 bit) pespese 4 tane byte tipi veriden olusur. Hafizadaki yerlesimi A, B, C, D seklindedir.

(Istisnalari saymazsak A en dusuk anlamli, D de en yuksek anlamli veridir.)

Long degiskenin adresini, tanimladiginiz byte pointera atayin. Sonra da sira ile pointerin gosterdigi verileri okuyun.


int a;
char *p;
char c1, c2, c3, c4;


int main(void)
{
      a=0x12345678;
      p=(char*)&a;

      c1=*p;      // 0x78
      c2=*(p+1);  // 0x56
      c3=*(p+2);  // 0x34
      c4=*(p+3);  // 0x12

}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

esensoy

Şöyle bir struct oluşturursanız;
typedef union {
        unsigned long ul;
        float f;

        struct {
            unsigned char msb;
            unsigned char msb_1;
            unsigned char msb_2;
            unsigned char lsb;
        } bytes;
    } Byte2Float_TYPE;

C source kodunda da diyelim ki b2f diye bir değişken oluşturdunuz,
Byte2Float_TYPE b2f;
uint32_t 32bit_degisken;
uint8_t a,b,c,d;

şimdi 32 bit değişkeni b2f ye aktarıp aşağıdaki gibi kullanabilirsiniz;
b2f.ul = 32bit_degisken;
a = b2f.msb;
b = b2f.msb_1;
c = b2f.msb_2;
d = b2f.lsb;

aynı şekilde float gönderim yaparken de çok işe yarıyor bu struct, float değeri b2f.f e eşitleyip, 4 seferde int8 olarak gönderiyorum,
En tehlikeli an "zafer" anıdır.

universitelim54

Tum arkadaslara ılgılerınden dolayı tesekkur ederım . el el den ustundur. paylasınca bırbırımıze daha faydalı oluyoruz .