0

多くの標準的なオープンソースコードでは、さまざまな場所で次のようなさまざまなポインタタイプが使用されています。

uint32 fooHash (uint8 *str, uint32 len)

私が得られないのは次のとおりです。-なぜintをuint32、uint8として宣言したいのですか?これらはすべてユーザースペース自体で実行されるので、uint自体として残してみませんか?移植性は後で問題になりませんか?

  • また、32ビットシステムでオープンソースコードを実行する場合は、なぜuint8*ptrとしてポインタを使用するのでしょうか。
4

4 に答える 4

5

ポインターのタイプは、ポインター自体のサイズではなく、ポインターに含まれるデータ型を参照します。すべてのポインタは実際には同じサイズです。([*]ただし、以下のコメントを参照してください)

がある場合uint8*、ポインタはuint8値の配列を参照します。これは、値uint32*の配列を参照する、と同じではありません。uint32

あなたの質問の反対側に答えるために...これらの型が明示的にされる理由は、すべてのコンパイラがのサイズに同意するわけではないからintです。それは携帯性の問題です。

于 2013-01-09T21:11:58.820 に答える
3

また、オープンソース コードを 32 ビット システムで実行する場合、ポインタを uint8 *ptr にする必要があるのはなぜですか?

uint8_tポインター自体のサイズではなく、ポインターが指すもののサイズです。 のタイプ*ptrは ですuint8_tオブジェクト の型は でptruint8_t *システムが必要とする大きさ (32 ビット、64 ビットなど) です。

ポインター演算を計算するときは、基本型が重要です。与えられたポインタ宣言

T *p;

式はafter型の'th要素p + iのアドレスに評価されます。がの場合、 に続く ' 番目の整数のアドレスが得られます。である場合、 に続く '番目の巨大な構造体のアドレスが得られます。例えば:iTpTintp + iipTstruct humongousp + iip

#include <stdio.h>
#include <stdint.h>

int main(void)
{
  uint8_t  *p0 = (uint8_t *)  0x00004000;
  uint32_t *p1 = (uint32_t *) 0x00004000;

  printf("p0 = %p, (p0 + 1) = %p\n", (void *) p0, (void *)(p0 + 1));
  printf("p1 = %p, (p1 + 1) = %p\n", (void *) p1, (void *)(p1 + 1));

  return 0;
}

出力を生成します

p0 = 0x4000、(p0 + 1) = 0x4001
p1 = 0x4000、(p1 + 1) = 0x4004

ポインターはすべて同じサイズである必要はなく、同じ表現を持っている必要もありません。たとえば、ハーバード アーキテクチャでは、命令とデータはメモリの別々の領域に格納され、バスのサイズが異なる場合があるため、オブジェクト ポインター ( 、int *char *)float *は 1 つのサイズ (たとえば 8 ビット) であり、関数ポインター (int (*foo)(void)サイズ (たとえば 16 ビット)。同様に、ワード アドレス アーキテクチャでは、achar *は、ワードへのオフセットを指定するために、他のポインター型よりも数ビット広い場合があります。

于 2013-01-09T22:19:20.267 に答える
2

すべてのデータがとして保存されるわけではありませんsigned int。Auint8*は、文字列、バイナリデータ(ネットワークパケットやファイルの一部など)など、多くの目的に役立ちます。

そこに格納しようとしている値の範囲がにあるため、uint8が必要な場合があります[0,256[

ポインタのタイプではなく、ポイントされたデータのタイプについて話していることを忘れないでください。ポインターは、それが指すタイプに関係なく、ポインター(アーキテクチャーに応じて正しいサイズになります)です。

于 2013-01-09T21:12:26.977 に答える
0

それはすべて、使用しているハードウェアとコンパイラに依存します。

int だけを使用すると、さまざまなサイズを取得できます。UNIX と Windows で異なるサイズを取得することもできます。

コンパイラに必要なものはすべて C99 標準のものです

sizeof(short) <= sizeof(int) <= sizeof(long) < sizeof(long long)

Windows プラットフォームの int 型のサイズ (ビット) は次のとおりです。

Type           C99 Minimum     Windows 32bit
char           8               8
short          16              16
int            16              32
long           32              32
long long      64              64

あなたは見てみる必要があります

以下は、名前が付けられたサイズであることが保証されています

int8_t
int16_t
int32_t
int64_t
int8_t 
于 2013-01-09T21:24:36.417 に答える