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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ごはん

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

#1

投稿記事 by ごはん » 9年前

このソースコードは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;
}

box
記事: 2002
登録日時: 14年前

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

#2

投稿記事 by box » 9年前

str
にはどういう情報が入っているかはおわかりでしょうか?

グダグダな字下げと
i++
のコンパイルエラーをどうにかしてほしいところです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

かずま

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

#3

投稿記事 by かずま » 9年前

ごはん さんが書きました:このソースコードは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進数への変換について

#4

投稿記事 by ごはん » 9年前

かずまさん、ご回答感謝いたします!!
詳しく、わかりやすい説明で意味を理解することができました。 助かりました!!

閉鎖

“C言語何でも質問掲示板” へ戻る