18

memcpy()この単純な実装のように、一度に 1 バイトずつメモリから読み取る必要があることがよくあります。

void *memcpy(void *dest, const void *src, size_t n)
{
    char *from = (char *)src;
    char *to   = (char *)dest;

    while(n--) *to++ = *from++;

    return dest;
}

ただし、unsigned char *単に . の代わりにchar *.

もちろん、charunsigned charは等しくない場合があります。しかしchar *、 、signed char *、またはバイト単位でunsigned char *メモリを読み書きするときに違いはありますか?

更新:c=200実際には、 のタイプによって値が異なる可能性があることを十分に認識していますc。ここで私が尋ねているのは、メモリを読み取るときunsigned char *だけではなく、たとえば を に格納するために を使用する理由です。char *uint32_tchar[4]

4

5 に答える 5

23

を使用する必要がありますunsigned char。C99 標準では、これが密であることが保証されている唯一の型 (パディング ビットなし) であると述べており、オブジェクト (ビットフィールドを除く) を配列にunsigned charコピーすることで正確にコピーできることも定義しています。これはバイト単位のオブジェクト表現です。unsigned char

これの賢明な解釈は、ポインタを使用してオブジェクトにバイトとしてアクセスする場合は、unsigned char.

参照: http://blackshell.com/~msmud/cstd.html#6.2.6.1 ( C1x ドラフトC99 より)

于 2011-12-05T13:50:00.203 に答える
14

これは、C++ が C と異なる点の 1 つです。一般的に言えば、C は生のメモリ アクセスがunsigned char. char符号付きで、1 の補数または符号付きマグニチュード マシンでは、-0 が自動的に +0 に変換され、ビット パターンが変更される場合があります。何らかの理由で (私にはわかりません)、C++ 委員会は、透過コピー (ビット パターンの変更なし) をサポートする保証をcharunsigned charおよび ;に拡張します。char 1 の補数または符号付きマグニチュード マシンでは、実装者は、そのような副作用を回避するために、単純な符号なしを作成するしかありません。(もちろん、今日のほとんどのプログラマーは、とにかくそのようなマシンには関心がありません。)

いずれにせよ、最終的には、C のバックグラウンドを持つ (実際には 1 の補数や符号付きマグニチュード マシンで作業したことがある) 年配のプログラマーは、自動的に を使用することになりますunsigned charcharまた、プレーンを一意に文字データ、signed char非常に小さな整数値、 unsigned char生メモリ、またはビット操作が意図されている場合に予約することも頻繁に行われます。このような規則により、読者はさまざまな用途を区別することができます (宗教的に守られている場合)。

于 2011-12-05T14:15:51.967 に答える
2

あなたのコード例では、違いはありません。しかし、それよりもバイトの値を表示/印刷したい場合(最上位ビットの解釈が異なるため)、unsigned charより適切と思われる場合

于 2011-12-05T13:22:04.817 に答える
0

それはあなたがcharに何を保存したいかによります。符号付き文字の範囲は-127〜127ですが、符号なし文字の範囲は0〜255です。

ポインタ演算の場合、それは重要ではありません。

于 2011-12-05T13:15:09.437 に答える
0
#include<stdio.h>
#include<string.h>

int main()
{

unsigned char a[4]={254,254,254,'\0'};
unsigned char b[4];
char c[4];

memset(b,0,4);
memset(c,0,4);

memcpy(b,a,4);
memcpy(c,a,4);
int i;
for(i=0;i<4;i++)
{
    printf("\noriginal is %d",a[i]);
    printf("\nchar %d is %d",i,c[i]);
    printf("\nunsigned char %d is %d \n\n",i,b[i]);
}

}

出力は

original is 254
char 0 is -2           
unsigned char 0 is 254 


original is 254
char 1 is -2
unsigned char 1 is 254 


original is 254
char 2 is -2
unsigned char 2 is 254 


original is 0
char 3 is 0
unsigned char 3 is 0 

したがって、ここでは char と unsign の両方が同じ値であるため、この場合は問題になりません

編集

その場合でも、最も高いビットもコピーされるので、問題ありません

于 2011-12-05T13:25:19.437 に答える