質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

5回答

1126閲覧

unsigned char 型の配列をint型にするやり方

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/11/11 08:20

編集2020/11/11 08:47

c言語

1#include <stdio.h> 2 3typedef unsigned char BYTE; 4 5void main() 6{ 7 BYTE ucNum[4] = {0xd8,0x07,0x00,0x00}; 8 int iNum; 9 10} 11

1byte単位でアクセスしているものに4byte単位でアクセスし、
unsigned char配列で書いてあるものをint型で2008と出るようにしたいです。

皆さんありがとうございます!
申し訳ないんですけど、これをbitシフトを使用して「000007D8」の形にしてからint型で出力することってできるんですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

そもそもint型が4byteであるかどうかは処理系依存です。stdint.hをincludeしてint32_t型を利用してください。

投稿2020/11/11 09:10

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/11/11 10:52

intが2バイトの処理系も併用していた頃、よく違いにハマったものです。
guest

0

ベストアンサー

Bitシフトでやりたいのであれば、

c

1 iNum = (ucNum[3] << 24) | (ucNum[2] << 16) | (ucNum[1] << 8) | ucNum[0];

投稿2020/11/11 08:58

akiruno-oneone

総合スコア815

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コレ↓があなたの求めるものか?

C

1#include <stdio.h> 2#include <string.h> 3 4typedef unsigned char BYTE; 5 6union data { 7 BYTE ucNum[4]; 8 int iNum; 9}; 10 11int main() { 12 union data tmp; 13 BYTE ucNum[4] = {0xd8,0x07,0x00,0x00}; 14 int iNum; 15 memcpy(tmp.ucNum, ucNum, sizeof(ucNum)); 16 iNum = tmp.iNum; 17 printf("%d\n", iNum); 18 return 0; 19}

投稿2020/11/11 08:30

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/11/11 08:37

ありがとうございます! 申し訳ないんですけど、これをbitシフトを使用して「000007D8」の形にしてからint型で出力することってできるんですか?
yumetodo

2020/11/11 09:09

printfのformatの問題じゃないですかね %08X\n にすればいいのでは。
yumetodo

2020/11/11 09:11

あとこの回答の方法はC++では未定義動作なのでもしC++としてコンパイルすることがあるならご注意を。
guest

0

処理系依存で良いのであれば
未定義動作との指摘があったので、回答を取り消します。

C

1//下記は未定義動作らしい 2//int iNum = *((int*)ucNum); 3

投稿2020/11/11 08:36

編集2020/11/11 11:19
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2020/11/11 09:08

それは処理系依存ではなくて未定義動作です。
退会済みユーザー

退会済みユーザー

2020/11/11 11:08

これってダメだったんですか。 ちなみに、共用体にした場合もダメなんです?
pepperleaf

2020/11/11 11:52

unNumの宣言の前に、 'char a;' とかあったりすると、不幸があったりします。 intel系なら、大丈夫?
退会済みユーザー

退会済みユーザー

2020/11/13 01:26 編集

詳細な記事の紹介助かります。 互換性の無い型のポインタにすると、同じアドレスを指しているポインタがある事を考慮しない最適化をして、どういう結果になるかわからないということですかね、なんと恐ろしい… しかし、void*を引数に取って何のポインタでも受け入れますって感じの関数は割と目にする機会がある気がするのですが、そういうのは果たして問題ないのか?という疑問も生じます。 VC++だとこのキャストでは警告を出さないのですが、gcc触れる機会がないのでWandboxでgcc試してみたのですが、7.1以下は最適化時に警告を出すのですね。7.2以上だと警告を出さなくなったのは、何か方針の転換があったんでしょうかね。
yumetodo

2020/11/13 05:11

詳細は覚えてないですが、void*型に束縛されたポインタは元の型に戻すかchar*系にするなら問題なかったはず・・・。
guest

0

以下のようにします。ucNumをそのままiNumへコピーします。
INTEL系のマシンなら正しく動作します。(int型は4バイト前提です)

C

1#include <stdio.h> 2#include <string.h> 3 4typedef unsigned char BYTE; 5 6void main() 7{ 8 BYTE ucNum[4] = {0xd8,0x07,0x00,0x00}; 9 int iNum; 10 memcpy(&iNum,ucNum,4); 11 printf("iNum=%d\n",iNum); 12} 13

実行結果
iNum=2008

投稿2020/11/11 08:32

tatsu99

総合スコア5424

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問