-1

sizeofunsigned char があり、それに整数を追加しますが、次のバイトを取得したい(つまりsizeof unsigned short intunsigned intなど)。

次のコードは、私が望むものを示しています。

#include <stdio.h>

static void write_ushort(unsigned char *b, unsigned short int value) { b[1] = value >> 8; b[0] = value; }
static void write_ulong(unsigned char *b, unsigned long int value) { write_ushort(b + 2, value >> 16); write_ushort(b, value); }

static unsigned short int read_ushort(const unsigned char *b) { return b[1] << 8 | b[0]; }
static unsigned long int read_ulong(const unsigned char *b) { return read_ushort(b + 2) <<16 | read_ushort(b); }

int main() {
     unsigned char b[2];
     unsigned int v0;       /* 4 */
     unsigned short int v1; /* 2 */

     v0 = 200; v1 = 1235;
     write_ushort(&b[0], v0); write_ulong(&b[1], v1);

     /* what i expect printf to output is:
      * 4 2 
      * but it obviously outputs 1 1 */
     printf("%d %d\n", read_ushort(&b[0]), read_ulong(&b[1]));
     printf("%d %d\n", (int)sizeof(b[0]), (int)sizeof(b[1]));
     return 0;
}
4

3 に答える 3

2

C は静的に型指定されており、変数 (または配列) に何かを代入してそのデータ型を変更することはできません。実際、変数のデータ型をまったく変更することはできません。変数は、コンパイル時に定義されたサイズのメモリの特定のチャンクに (ほぼ正確に) 対応します。変数をキャストして、特定の操作に対して異なる型であるかのように処理することができますが、メモリのチャンクは常に同じサイズです。


char[2]また、変数は単なるメモリのブロックであるため、コンピューター (またはコンパイラー) が配列を使用して ashortまたは aを格納していることを知る方法はありませんlong。これは自分で追跡する必要があります。

于 2012-08-15T06:03:57.583 に答える
2

これは不可能です。演算子は、型のsizeofサイズ、または変数の宣言された型のサイズを返します。それ以外に何も操作することはできません。コードは、数値を新しい変数に割り当てる前に、その数値が格納された変数の型を追跡しません。

v0またはのタイプに関係なくv1、それらが配列の要素に格納されると、それらは に変換されunsigned charます。

出力として必要な場合は、 andを4 2に渡すか、別の方法でこれを追跡する必要があります。sizeof(v0)sizeof(v1)printf

于 2012-08-15T06:05:54.753 に答える
1

ここに大きな問題があります:

write_ulong(&b[1], v1);

(2 バイト配列の) 2 番目のバイトを取得し、4write_ulongバイトの配列として処理される場所に渡します。これは、元の配列を超えて数バイトを書き込んでおり、スタックを上書きしていることを意味します。これは未定義の動作であり、プログラムの動作が非常に奇妙になります。b

于 2012-08-15T06:23:03.087 に答える