2.7 型変換, 演習2-3 K&R プログラミング言語C

2.7 型変換

math.h をインクルードしているにもかかわらず、以下のようなエラーメッセージが表示されてコンパイルできない場合は、gcc-lm オプションを付けて手動リンクさせる必要がある。

$ gcc -Wall -o cast cast.c
/tmp/cceQkYQw.o: In function `main':
cast.c:(.text+0x41): undefined reference to `sqrt'
                     collect2: ld returned 1 exit status

整数と倍精度浮動小数点数の型変換

#include <stdio.h>
#include <math.h>

int main(int argc, char *argv[])
{
    int n = 2;
    double d = 5.432;

    printf("%f\n", (double) n);
    printf("%f\n", sqrt((double) n));
    printf("%d\n", (int) d);

    return 0;
}

実行結果

$ ./cast
2.000000
1.414214
5

演習2-3

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int htoi(char *s);
int to_int(char c);

int main(int argc, char *argv[])
{
    printf("0xff => %d\n", htoi("0xff"));
    printf("0X7B => %d\n", htoi("0X7B"));
    printf("1f => %d\n", htoi("1f"));
    printf("2A => %d\n", htoi("2A"));

    return 0;
}

int htoi(char *s)
{
    int i, j, c, val, len;

    len = strlen(s);

    if (len == 2 || len == 4) {
        if (s[0] == '0' && toupper(s[1]) == 'X') {
            i = 2;
        } else {
            i = 0;
        }
        for (j=0; i < len; i++, j++) {
            c = toupper(s[i]);
            if (j == 0) {
                val = 16 * to_int(c);
            } else if (j == 1) {
                val = val + to_int(c);
            }
        }
        return val;
    } else {
        return -1;
    }

    return 0;
}

int to_int(char c)
{
    if (c >= 'A' && c <= 'F') {
        return c - 55;
    } else if (c >= '0' && c <= '9') {
        return c - 48;
    } else {
        return -1;
    }
}

実行結果

$ ./ex2-3
0xff => 255
0X7B => 123
1f => 31
2A => 42
プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
«
»