2010-11-19 13 views
3

Birisinin cevaplayabileceğini umduğum memcpy hakkında bir sorum var. Burada kısa inandırıcı program: ben bu programı çalıştırdığınızdaC imzasız char dizilimi olan memcpy sorunları

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 


int main (int argc, char **argv){ 
    unsigned char buffer[10]; 
    unsigned short checksum = 0x1234; 
    int i; 
    memset(buffer, 0x00, 10); 
    memcpy(buffer, (const unsigned char*)&checksum, 2); 
    for(i = 0; i < 10; i ++){ 
    printf("%02x",buffer[i]); 
    } 
    printf("\n"); 
    return 0; 
} 

, ben 12340000000000000000 alamadım neden 34120000000000000000.
Benim sorum olsun?

+0

Makinenizin mimarisi nedir? – Phong

cevap

2

little endian/big endian mimarisi çok

Teşekkür? , yani 2 baytlık sağlama toplamı tersine çevrilir.

Sadece bir tahmindir, cevabım doğru değilse Yorum yap ve onu sileceğim.

+0

Endianess iyi bir nokta, ama aynı sonuçları iki farklı makinede çalıştırdığımda görüyorum, biri Intel P4 karınca diğeri ise endeksi ve büyük endian mimarileri olduğuna inandığım bir AMD64. – aarbear

+1

AMD64 çok enderdir http://stackoverflow.com/questions/1024951/does-my-amd-based-machine-use-little-endian-or-big-endian –

+0

@aarbear: SPARC üzerinde deneyin. – caf

1

Intel'in CPU onlar görünüşte Intel tesis içi uyuşturucu testi yapmayın olduklarının bir kanıtıdır numaraları

Bu ilk küçük kelime saklamak, little endian vardır.

+1

hahaha için destek vardır. Aslında küçük bir endianın büyük endianın sahip olmadığı pek çok avantajı yoktur. tıpkı 0 tabanlı endeksleme gibi. –

+0

@Matt Joiner - ŞİMDİ DURDURUN. Ya da zaman aşımı için 1980'e geri gönderileceksiniz. – detly

+0

@detly: Daha önce tanışmış mıydık? Cevaplarımda bir trend fark ettin mi? –

8

34120000000000000000 oluyorsunuz, çünkü biraz endian sistemindesiniz. Büyük bir endian sistemde 12340000000000000000 alırsınız. Endianness, büyük endian ve küçük endian sistemlerin tam bir tartışmasını verir.