다양한 버전의 코드를 개발하는 동안 다른 것들은 아래에 설명 된 것과 동일한 내용을 명시했습니다.
코드가 32 비트 버전에서 작동하는 이유는 우연이라고 생각합니다. 분명히 그 시스템에서 초기화되지 않은 mask_val이 방금 제로가되었을 때, 당신은 "운이 좋았습니다".
다음은 나만의 코드 세 가지 버전의 진행 상황을 보여줍니다. 첫 번째 코드는 본질적으로 변경되지 않았지만 mask_val을 0으로 초기화하고 코드를 실행하려는 유형에 대한 typedef를 사용합니다. 두 번째는 같지만 BIT [] 테이블이 없습니다. 세 번째는 루프를 제거합니다.
#if 0
#include <stdio.h>
typedef long long valTy;
int main()
{
static unsigned int BIT[] = {
0x1, 0x2, 0x4, 0x8,
0x10, 0x20, 0x40, 0x80,
0x100, 0x200, 0x400, 0x800,
0x1000, 0x2000, 0x4000, 0x8000,
0x10000, 0x20000, 0x40000, 0x80000,
0x100000, 0x200000, 0x400000, 0x800000,
0x1000000, 0x2000000, 0x4000000, 0x8000000,
0x10000000, 0x20000000, 0x40000000, 0x80000000
};
valTy val1, val2;
valTy mask_val;
int i, nbits[2];
printf("\n");
nbits[0] = nbits[1] = 2;
val1 = -41;
val2 = -45;
printf(" val1 = 0x%016llx (%lld)\n", (long long)val1, (long long)val1);
printf(" val2 = 0x%016llx (%lld)\n", (long long)val2, (long long)val2);
printf("\n");
mask_val = 0;
for (i = nbits[0]; i <= nbits[1]; i++)
mask_val = mask_val|BIT[i];
printf("mask_val = 0x%016llx\n\n", (long long)mask_val);
val1 = (val1 & mask_val) >> nbits[0];
val2 = (val2 & mask_val) >> nbits[0];
printf(" val1 = 0x%016llx (%lld)\n", (long long)val1, (long long)val1);
printf(" val2 = 0x%016llx (%lld)\n", (long long)val2, (long long)val2);
printf("\n");
}
#endif
#if 0
#include <stdio.h>
typedef long long valTy;
#define BIT(bitnum) (1<<bitnum)
int main()
{
valTy val1, val2;
valTy mask_val;
int i, nbits[2];
printf("\n");
nbits[0] = nbits[1] = 2;
val1 = -41;
val2 = -45;
printf(" val1 = 0x%016llx (%lld)\n", (long long)val1, (long long)val1);
printf(" val2 = 0x%016llx (%lld)\n", (long long)val2, (long long)val2);
printf("\n");
mask_val = 0;
for (i = nbits[0]; i <= nbits[1]; i++)
mask_val = mask_val | BIT(i);
printf("mask_val = 0x%016llx\n\n", (long long)mask_val);
val1 = (val1 & mask_val) >> nbits[0];
val2 = (val2 & mask_val) >> nbits[0];
printf(" val1 = 0x%016llx (%lld)\n", (long long)val1, (long long)val1);
printf(" val2 = 0x%016llx (%lld)\n", (long long)val2, (long long)val2);
printf("\n");
}
#endif
#include <stdio.h>
typedef long long valTy;
#define BIT(bitnum) (1<<bitnum)
int main()
{
valTy val1, val2;
valTy mask_val;
int i, nbits[2];
printf("\n");
nbits[0] = nbits[1] = 2;
val1 = -41;
val2 = -45;
printf(" val1 = 0x%016llx (%lld)\n", (long long)val1, (long long)val1);
printf(" val2 = 0x%016llx (%lld)\n", (long long)val2, (long long)val2);
printf("\n");
mask_val = 0;
{
valTy maskTop = ((BIT(nbits[0])-1)<<1)|1;
valTy maskBottom = BIT(nbits[1])-1;
mask_val = maskTop & ~maskBottom;
}
printf("mask_val = 0x%016llx\n\n", (long long)mask_val);
val1 = (val1 & mask_val) >> nbits[0];
val2 = (val2 & mask_val) >> nbits[0];
printf(" val1 = 0x%016llx (%lld)\n", (long long)val1, (long long)val1);
printf(" val2 = 0x%016llx (%lld)\n", (long long)val2, (long long)val2);
printf("\n");
}
int 형과 long 형은 이식 가능하지 않습니다. 대신에'stdint.h' 타입을 사용하십시오 :'int32_t','uint32_t','int64_t','uint64_t'. – sfstewman
@sfstewman 그게 나에게 맞는 대답 인 것 같아서, 그냥 코멘트가 아니라 그처럼 게시해야한다. –
초기화하지 않으면 나를 불편하게 만든다 :'unsigned long mask_val;'하지만 나는 그것이 어떤 원인인지 모른다. 너의 문제들. – Justin