を含ま私は2つの配列を1つは符号なしの文字で、もう1つは符号なしの整数で作成します。考えられるのはrgba配列をシミュレートし、それをポインタまたはビットごとに操作することの違いです。は、ビット単位の操作配列から誤った値を受け、Cのコードは、私はビット単位の詳細については、私はそれで私のコードのパフォーマンスを向上する方法を見しようとしているので、私はそのコードでは、テストコードを作った
すべてが機能していることを確認するには、最後に配列のすべての値の合計を計算します。問題は、ポインタで操作した配列の値がビット単位の値と異なる点です。整数配列には4つの位置しかなく、char配列には16があります。彼らは私に最終的に同じ結果を与えるべきですが、char 1だけが私にそれを与えます(2000年は償いの結果です)。ここで
はコードです:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
inline double
ucharArray(void);
inline double
intArray(void);
int32_t
main(int32_t argc, int8_t* argv[])
{
double sum = 0;
sum = ucharArray();
printf("%lf\n", sum);
sum = 0;
sum = intArray();
printf("%lf\n", sum);
return 0;
}
inline double
intArray(void)
{
double sum = 0;
uint32_t* array_uint = (uint32_t*) malloc(2 * 2 * sizeof(uint32_t));
register uint32_t* p_a = array_uint;
register uint32_t* p_last = p_a + 2 * 2;
for (;;)
{
*p_a |= (50 << 24);
*p_a |= (100 << 16);
*p_a |= (150 << 8);
*p_a |= 200;
if (p_a == p_last)
break;
p_a++;
}
p_a = array_uint;
for (;;)
{
sum += (*p_a & 0xFF000000) >> 24;
sum += (*p_a & 0x00FF0000) >> 16;
sum += (*p_a & 0x0000FF00) >> 8;
sum += *p_a & 0x000000FF;
if (p_a == p_last)
break;
p_a++;
}
free(array_uint);
return sum;
}
inline double
ucharArray(void)
{
double sum = 0;
uint8_t* array_uchar = (uint8_t*) malloc(2 * 2 * 4 * sizeof(uint8_t));
register uint8_t* p_a = array_uchar;
register uint8_t* p_last = p_a + 2 * 2 * 4;
for (;;)
{
*p_a = 50;
p_a++;
*p_a = 100;
p_a++;
*p_a = 150;
p_a++;
*p_a = 200;
p_a++;
if (p_a == p_last)
break;
}
p_a = array_uchar;
for (;;)
{
sum += *p_a;
p_a++;
sum += *p_a;
p_a++;
sum += *p_a;
p_a++;
sum += *p_a;
p_a++;
if (p_a == p_last)
break;
}
free(array_uchar);
return sum;
}
そして相続人は私の出力です:
~ $ gcc test.c -g
~ $ ./a.out
2000.000000
3484.000000
あまりにも多くのSOの質問のコード。あなたの例を問題/矛盾がまだ残っている最小限に抑えてください。 –