16進数の下位2桁を取り出す処理について

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

Re: 16進数の下位2桁を取り出す処理について

#31

投稿記事 by C6b14 » 2年前

>C言語上ではバイトオーダーは気にしなくてもいいのですね。
>では、なぜリトルとビッグがあるのでしょうか?
>実行速度が若干変わったりするのでしょうか?
そのとうりです。 インテル が 最初に CPU (x86のもと) を 作った時 日本人 の 嶋正利さん が 中心になってつくられたのですが。
リトルエンデイァン のほうが 実行速度 で 有利だったのと なにか 利点があったはず。IBM 、モトローラ、Sun は ビッグエンデイァン
の アーキテクチャ で CISCとRISCの 違い だった と思います。 

C6b14

Re: 16進数の下位2桁を取り出す処理について

#32

投稿記事 by C6b14 » 2年前

エンディアンの 話 は 記憶 違い でした。ごめんm(__)m。CISC  と RISC の違いも あったのでしょうか。

C6b14

Re: 16進数の下位2桁を取り出す処理について

#33

投稿記事 by C6b14 » 2年前

みけCAT さんが書きました:
C6b14 さんが書きました:バイト の 中身 が 逆 ( 答え 5B なら B5 )です。
いいえ。バイトの中身ではなく、バイトを配置する順番が違います。
例えば、0xDEADBEEFという値は、(バイト単位でアドレスがついている)メモリ上のデータは
リトルエンディアンだとEF BE AD DE
ビッグエンディアンだとDE AD BE EF
となります。

エンディアン - Wikipedia
バイトオーダ - ビッグエンディアン/リトルエディアン
ごめんなさい。間違いです。

C6b14

Re: 16進数の下位2桁を取り出す処理について

#34

投稿記事 by C6b14 » 2年前

[追記]この問題の回答を書くの忘れてたので書いておきます。

コード:

/*
以下のプログラムは「入力された整数の16進数下2ケタを表示する」プログラムである。
例・0x12345678 → 78  0x3456 → 56
「空欄」と記された部分を埋めてプログラムを完成させよ。
なお、このプログラムが動作するコンピュータのバイトオーダーはリトルエンディアンとする。
*/
#include<stdio.h>

//空欄1
void DispSimo(long* temp);
//空欄1

void main() {
	short a;
	long b;

	printf("1つ目の整数を16進数で入力:");
	scanf("%hx", &a);
	DispSimo(&a);       //変数aの16進数下2ケタを表示

	printf("2つ目の整数を16進数で入力:");
	scanf("%lx", &b);
	DispSimo(&b);       //変数bの16進数下2ケタを表示

	rewind(stdin);
	getchar();
}

//空欄2
void DispSimo(long* temp) {
	*temp = *temp & 0xFF;
	printf("%x\n", *temp);
}
//空欄2

アバター
みけCAT
記事: 6148
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: 16進数の下位2桁を取り出す処理について

#35

投稿記事 by みけCAT » 2年前

C6b14 さんが書きました:

コード:

void DispSimo(long* temp) {
	*temp = *temp & 0xFF;
	printf("%x\n", *temp);
}
unsigned int型のデータを渡されることを期待する%xにlong型のデータを渡したので、未定義動作です。
さらに、short型よりlong型が大きい環境の場合、確保された範囲の外の読み書きを行ってしまい、危険です。

対抗して解答例を書いておきます。

コード:

/*
以下のプログラムは「入力された整数の16進数下2ケタを表示する」プログラムである。
例・0x12345678 → 78  0x3456 → 56
「空欄」と記された部分を埋めてプログラムを完成させよ。
なお、このプログラムが動作するコンピュータのバイトオーダーはリトルエンディアンとする。
*/
#include<stdio.h>

//空欄1
void DispSimo(const void* temp);
//空欄1

void main() {
	short a;
	long b;

	printf("1つ目の整数を16進数で入力:");
	scanf("%hx", &a);
	DispSimo(&a);       //変数aの16進数下2ケタを表示

	printf("2つ目の整数を16進数で入力:");
	scanf("%lx", &b);
	DispSimo(&b);       //変数bの16進数下2ケタを表示

	rewind(stdin);
	getchar();
}

//空欄2
void DispSimo(const void* temp) {
	printf("%02x\n", (unsigned int)(*(const unsigned char*)temp & 0xff));
}
//空欄2
Wandboxでの実行結果

コード:

1つ目の整数を16進数で入力:56
2つ目の整数を16進数で入力:78
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Egg

Re: 16進数の下位2桁を取り出す処理について

#36

投稿記事 by Egg » 2年前

void main()やrewind(stdin)を含む気持ち悪いプログラムは潰してしまえばいいでしょう。
void main()やrewind(stdin)を使わない正しい解答を提示したほうがよろしいと思われますが。


C6b14

Re: 16進数の下位2桁を取り出す処理について

#38

投稿記事 by C6b14 » 2年前

>void main()やrewind(stdin)を使わない正しい解答を提示したほうがよろしいと思われますが
すみません。rewind(stdin)は消すべきでした。void main() 正しくはint main()とかくべしと思いますが。いまの規則ではvoid main() と書いてあってもint main()と同じ機械語が生成されるので一概には間違いとは言えないです。ただしC言語を教えるひとがvoid main() と書くのはやはりどうかなとおもうのでint main()が正しいとはおもいます。http://www.6809.net/tenk/html/cgokai/int_main.htm

C6b14

Re: 16進数の下位2桁を取り出す処理について

#39

投稿記事 by C6b14 » 2年前

あ、それと”問題文に、「「空欄」と記された部分を埋めてプログラムを完成させよ。」とあるように、空欄以外の部分は触ってはいけない決りとなっているためその方法は取れません”と質問者様の返信にあったのです。しかしrewind(stdin)やvoid main()を使って教えるのは意味不明だし、何らかの前提条件があったように思います。(出題者が変といえば、そうです)

C6b14

Re: 16進数の下位2桁を取り出す処理について

#40

投稿記事 by C6b14 » 2年前

ここを読むとhttp://keicode.com/winprimer/wp06.phpmainである必然性はなくてFooから始まるプログラムもVS2015では作れるので問題はC++17,14,11など規則だけの問題に見えます。Windows10,VS2015の処理系だけしか無いので規則の問題はよくわかりません。


アバター
みけCAT
記事: 6148
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: 16進数の下位2桁を取り出す処理について

#42

投稿記事 by みけCAT » 2年前

Egg さんが書きました:
void main()やrewind(stdin)を含む気持ち悪いプログラムは潰してしまえばいいでしょう。
void main()やrewind(stdin)を使わない正しい解答を提示したほうがよろしいと思われますが。
確かにそうですね。
「プログラムを完成させる」という趣旨に反する気がしたので避けたのですが、よく考えたらただDispSimo関数を定義するだけなら本来空欄2なんて必要ないので、わざわざ空欄2があるということは不適切なプログラムをプリプロセッサで消し去る方が正しいと考えられるでしょう。

コード:

/*
以下のプログラムは「入力された整数の16進数下2ケタを表示する」プログラムである。
例・0x12345678 → 78  0x3456 → 56
「空欄」と記された部分を埋めてプログラムを完成させよ。
なお、このプログラムが動作するコンピュータのバイトオーダーはリトルエンディアンとする。
*/
#include<stdio.h>

//空欄1
void DispSimo(int n) {
	unsigned long a;
	printf("%dつ目の整数を16進数で入力:", n);
	if (scanf("%lx", &a) == 1) {
		printf("%02x\n", (unsigned int)(a & 0xff));
	} else {
		puts("入力エラー");
		scanf("%*s"); /* ゴミがあると予想されるので取る */
	}
}

int main(void) {
	int i;
	for (i = 1; i <= 2; i++) {
		DispSimo(i);
	}
	return 0;
}

#if 0
//空欄1

void main() {
	short a;
	long b;

	printf("1つ目の整数を16進数で入力:");
	scanf("%hx", &a);
	DispSimo(&a);       //変数aの16進数下2ケタを表示

	printf("2つ目の整数を16進数で入力:");
	scanf("%lx", &b);
	DispSimo(&b);       //変数bの16進数下2ケタを表示

	rewind(stdin);
	getchar();
}

//空欄2
#endif
//空欄2
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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