On mercredi 01 juin 2011, Frédéric wrote:
> Par contre, sur une machine 64bits, le bidule ne démarre pas :o(
Doit y avoir un souci avec le code ci-dessous ; je ne sais pas trop à quoi
il sert (sans doute pour remettre d'aplomb les merdouilles du hardware, qui
semble assez bourrin !).
D'après vous, est-ce qu'il fonctionne de la même façon sur une machine
32bits et 64bits, ou y a-t-il un truc à améliorer ?
/* force byte order (endianness) by casting char -> short int */
#define num2bin_data ((short int *)num2bin_data_char)
char num2bin_data_char[] =
{
0x00, 0x00, /* 0 */
0x80, 0x3F, /* 1 */
0x00, 0x40, /* 2 */
0x40, 0x40, /* 3 */
0x80, 0x40, /* 4 */
0xA0, 0x40, /* 5 */
...
0xC4, 0x42, /* 98 */
0xC6, 0x42, /* 99 */
0xC8, 0x42, /* 100 */
};
short int num2bin(short int num)
{
if (num < -NUM2BIN_MAX || NUM2BIN_MAX < num) {
printf("num2bin: cant convert number %i\n", num);
return 0;
}
if (num < 0)
return num2bin_data[-num] | SIGN_BIT;
else
return num2bin_data[num];
}
short int bin2num(short int bin)
{
int i, is_negative;
is_negative = bin & SIGN_BIT;
if (is_negative)
bin ^= SIGN_BIT; // unset sign bit
for (i = 0; i <= NUM2BIN_MAX; i++) {
if (num2bin_data[i] == bin) {
if (is_negative)
return -i;
else
return i;
}
}
if (is_negative)
printf("bin2num: cant convert data %x\n", bin | SIGN_BIT);
else
printf("bin2num: cant convert data %x\n", bin);
return 0;
}
--
Frédéric