ページ 11

16進数から10進数への変換について

Posted: 2016年5月26日(木) 20:13
by ごはん
このソースコードは16進数から10進数に変換するというものなのですが、
x=x*16+str-'0' とx=x*16+str-'a'+10
計算で10進数に変換するのですが、仕組がよくわかりません! 
教えてください! 

コード:

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

int main()
{
	char str[128];
	long x=0;
	int i=0;
	
	printf ("16進数を入力");
	scanf ("%s",str); 
	//データ変換処理
	while (str[i]!='\0') {
		//16進数で表せる文字か
		if (isxdigit(str[i])!=0) {
			//数字で表せる文字か
			if (isdigit(str[i])!=0) {
				//10進数に変換
				x=x*16+str[i]-'0';
			}
		else {
			//大文字は小文字に変換
			str[i]=tolower(str[i]);
			//10進数に変換
			x=x*16+str[i]-'a'+10;
		}
		}
		else
		{
			printf ("10進数には変換できません\n");
			return 0;
		}
		i++
	}
	printf ("10進数:%ld\n",x);
	
	return 0;
}

Re: 16進数から10進数への変換について

Posted: 2016年5月26日(木) 21:50
by box
str
にはどういう情報が入っているかはおわかりでしょうか?

グダグダな字下げと
i++
のコンパイルエラーをどうにかしてほしいところです。

Re: 16進数から10進数への変換について

Posted: 2016年5月28日(土) 09:22
by かずま
ごはん さんが書きました:このソースコードは16進数から10進数に変換するというものなのですが、
x=x*16+str-'0' とx=x*16+str-'a'+10
計算で10進数に変換するのですが、仕組がよくわかりません!

x = x*16 + str-'0';
この場合、str は '0'~'9' ですが、これを 0~9 という値に変換するのは
str-'0' で行えます。現在の x の値は、str の上位の桁によるものですから
16倍して新しい値としています。

x = x*16 + str-'a'+10;
この場合、str は 'a'~'f' ですが、これを 10~15 という値に変換するのは
str-'a'+10 で行えます。

これらの計算は 16進の文字列を数値にしているだけで 10進数にしているわけでは
ありません。コンピュータの内部では、long x が 32ビットか 64ビットか知りま
せんが、2進数で値を持っています。

それを 10進の文字列に変換しているのは、printf の "%ld" によるものです。

では、ちょっと面白いプログラムを

コード:

#include <stdio.h>
#include <ctype.h>
 
int main(void)
{
    char str[128];
    while (printf("16進数を入力: "), scanf("%127s", str) == 1) {
        unsigned long x = 0;
        unsigned char c;
        for (int i = 0; (c = str[i]) && isxdigit(c); i++)
            x = x<<4 | (c>>6)*9+c & 15;
        if (c)
            puts("10進数には変換できません");
        else
            printf("10進数: %lu\n", x);
    }
    return 0;
}
文字コードが EBCDIC の場合は、(c>>6) を (c<240) に変えてください。

Re: 16進数から10進数への変換について

Posted: 2016年5月28日(土) 13:21
by ごはん
かずまさん、ご回答感謝いたします!!
詳しく、わかりやすい説明で意味を理解することができました。 助かりました!!