1. 共用体を用いる
コード:
#include <stdio.h>
typedef union {
int i;
char c[4];
} int_char;
int main(void) {
char a[5] = {0x12,0x34,0x56,0x78,0x9A};
int b = 0xDEADBEEF;
unsigned char W,X,Y,Z;
int_char ic;
/* エンディアンは関係なく、メモリ上の最初にあるバイトを1バイト目とする */
ic.i = b;
W = ic.c[0];
X = ic.c[1];
Y = ic.c[2];
Z = ic.c[3];
/* 素直に計算する */
a[0]=(a[0]+W)%16;
a[1]=a[1] >= X ? a[1]-X : X-a[1];
a[2]=(a[2]+a[0])%16;
a[3]=a[3]/Y;
a[4]=(char)(((int)a[4]*(int)Z)%16);
printf("%d %d %d %d %d\n",(int)a[0],(int)a[1],(int)a[2],(int)a[3],(int)a[4]);
return 0;
}
2. ビット演算を用いる
コード:
#include <stdio.h>
int main(void) {
char a[5] = {0x12,0x34,0x56,0x78,0x9A};
int b = 0xDEADBEEF;
unsigned char W,X,Y,Z;
/* エンディアンに従い、数値の下位8ビットを1バイト目とする */
W=b&0xFF;
X=(b>>8)&0xFF;
Y=(b>>16)&0xFF;
Z=(b>>24)&0xFF;
/* 素直に計算する */
a[0]=(a[0]+W)%16;
a[1]=a[1] >= X ? a[1]-X : X-a[1];
a[2]=(a[2]+a[0])%16;
a[3]=a[3]/Y;
a[4]=(char)(((int)a[4]*(int)Z)%16);
printf("%d %d %d %d %d\n",(int)a[0],(int)a[1],(int)a[2],(int)a[3],(int)a[4]);
return 0;
}
どっちの方法がいいかは、用途に応じて考えてください。
オフトピック
そもそも、C言語ではint型が4バイトであるとは限りません。
例えば、LSI C-86 試食版におけるint型は2バイトでした。