• ベストアンサー
  • すぐに回答を!

キャストを使った型拡張の方法について

変数が以下のように宣言されている時で、掛け算する場合のキャスト の方法について質問です。 char = data1; short = data2; long = GOUKEI; (1) GOUKEI = (long)data1 * (long)data2; (2) GOUKEI = (long)(data1 * data2 ); 上記、(1)、(2)のキャストは同じ意味と判断して良いのでしょうか? 詳しい方ご回答よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数58
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.2
  • Tacosan
  • ベストアンサー率23% (3656/15482)

(1) の方は先に long にしてから計算しますが, (2) の方は int (ないし int 経由で unsigned int) で計算してから long に変換します. だから, 一般には違います.

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 キャスト拡張にもやり方によっては優先順位で 結果が違ってしまうという事があるのですね。 勉強になりました。

関連するQ&A

  • 配列同士の足し算のループ処理

    まず、初心者ですよろしくお願いします。 $data1=(3,2,4,0,2,3,5,4); $data2=(2,4,0,2,3,1,4,1); と配列が2つあって、合計した配列をあらたに作りたかったのですが、 $goukei=($data1[0]+$data2[0],........[7]) としたら出来たのですが、ループでやりたかったので for($i=0; $i<8; $i++) { $goukei[] = ($data1[i]+$data2[i]); } としましたができませんでした。 $i=0; foreach( $data1 as $v) { $goukei[] = ($v+$data2[i]); $i++; } もだめでした。 どうすればできますでしょうか?

    • ベストアンサー
    • PHP
  • 64bit → 32bit型へのキャスト

    long 64data = 1; int 32data = (int)64data; 64bitの変数で上位32bitは使わない場合、int型の変数にキャストして代入することは可能ですか?

  • ビット演算を使えば出来ますか?

    あるchar型の変数の各ビットを二つずつにして別の変数にしまいたい場合どういうプログラムを作ればいいでしょうか? char型の変数 data1 = 0x51があるとします。 2進数で表すと[01010001] になります。 これを別のchar型の変数に data2=[00110011], data3=[00000011]というふうにしてしまいたいのです。 なにぶん素人なものでうまく説明できませんが各ビットを二つにして横に伸ばすイメージです。 0→00 1→11 となります。 data1=0x33だと[00110011]ですから作りたいデータは data2=[00001111],data3=[00001111]です。 data1=0x12だと[00010010]ですから作りたいデータは data2=[00000011],data3=[00001100]です。 for文とビット演算をつかってdata1からdata2とdata3を作れそうな気はしますがよくわかりません。 説明が分かりにくくて申し訳ありませんが、どなたか教えていただけないでしょうか?

その他の回答 (2)

  • 回答No.3

16ビットCPU用のコンパイラでは結果が異なるでしょうね。 例えば char型⇒8ビット(符号1ビット、整数部7ビット) int型、short型⇒16ビット(符号1ビット、整数部15ビット) long型⇒32ビット(符号1ビット、整数部31ビット) と言う実装をしたコンパイラでは、(1)の式では問題ありませんが、(2)の式ではオーバーフローが起きる場合があります。 従って「(1)の式は環境に依存しないが、(2)の式は環境に依存する」と言う違いがあり、意味も違います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 コンパイラに依存するとは考えが及びませんでした。 このような知識を教えて頂いて勉強になりました。

  • 回答No.1

意味が違います。 >(1) GOUKEI = (long)data1 * (long)data2; data1とdata2をlong型としてかけ算します。 >(2) GOUKEI = (long)(data1 * data2 ); data1とdata2を元の型のままかけ算します。その答えをlong型にします。 が、charをかけ算に使うのはいかがなものかと思いますけど。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 (2)の方法だとオーバーフローした結果をlong型に拡張するハメ になってしまうんですね。 勉強になりました。

関連するQ&A

  • MicroC コンパイラ 変数宣言

    MicroC コンパイラ 変数宣言について質問です BYTE tmp1; WORD tmp2; なる定義があったとして 変数型範囲はどの範囲になるのでしょう 下記の定義は見つかったのですが 上記は分かりません 変数型 バイト数 範囲 (unsigned) char 1 0 .. 255 signed char 1 - 128 .. 127 (signed) short (int) 1 - 128 .. 127 unsigned short (int) 1 0 .. 255 (signed) int 2 -32768 .. 32767 unsigned (int) 2 0 .. 65535 (signed) long (int) 4 -2147483648 .. 2147483647 unsigned long (int) 4 0 .. 4294967295 float 4 ±1.17549435082 * 10-38&#160;.. ±6.80564774407 * 1038 double 4 ±1.17549435082 * 10-38&#160;.. ±6.80564774407 * 1038 long double 4 ±1.17549435082 * 10-38&#160;.. ±6.80564774407 * 1038

  • 配列へのプラス?

    C++のコードを読んでいるところなのですが、 配列に プラスされているコード部の意味がわからずこまっております。 ********************************* unsigned char data1[32]; unsigned char data2[8]; ※ここでdata1, data2に値入力処理 if(memcmp(data1 + 2, data2, 8) != 0){  //処理X } ********************************* 上記のようなコードの「data1 + 2」の部分がよくわかりません。 byte配列にプラスされている2は、数値なのでしょうか?? C++は普段使わないもので、、、呆れるほどアホな質問だとしてもご了承ください。。 どなたかご教授ねがいます。 よろしくお願いいたします。

  • for文内での計算の仕方

    宜しくお願いします。 <script language="javascript"> <!-- var Data1 ='2'; var Data2 ='1'; var Data3 ='2'; ... var Data50 ='2';まであるとして。 Data1~100までの合計の数字を求め、表示させたい箇所に("+goukei+")としたいのですが、 goukei=parseInt(DataSu1)+parseInt(DataSu2)...+parseInt(DataSu50); という風に行うのではなく、for文などを使ってスマートにできないでしょうか。 試しにイメージとして下記のように指定してみたりしているのですがうまく動作しないです。 goukei=0 var i=0 for(i=0; i<50; i++){ parseInt(goukei)+parseInt(Data) Data++ } ご教授の程宜しくお願いします。

  • C キャスト方法を教えてください

    C言語の初心者なのですが、 int abc(int(*read)(void*, int, int), int size, char* data); ような関数で第1引数の値をキャストするときどうすればよいですか。   int read = (????)NULL; そもそもint(*read)(void*, int, int)ってどういう意味ですか?

  • 特定のセッション変数の内容だけ破棄

    $_SESSION['data1'] $_SESSION['data2'] $_SESSION['data3'] $_SESSION['data4']  このようにセッション変数が複数ある場合、session_destroy();を宣言するとすべてのセッション変数の内容が破棄されますが、例えば「$_SESSION['data1']と$_SESSION['data2']だけ」といったように、特定のセッション変数の内容だけを破棄することは出来ますか?

    • ベストアンサー
    • PHP
  • パラメーターについて

    質問させてください。 http://testserver.com/test/test.cgi?data1=000&data2=000&data3=000&data1=111&data2=111&data3=000 を実行したときについての質問です。 パラメータの変数名が同じものがある場合、上記の場合はどちらを取得するのでしょうか? 配列変数とかでわたってくるのでしょうか? 上記の場合、 data1=111 data2=222 data3=333 を取得したいと考えています。 確認する環境がないため質問させていただきました。 宜しくお願い致します。

  • jQueryでxmlデータ取得について

    jQueryでxmlのデータを取得しました。 jsで宣言した変数データがあって、 その変数のデータと xmlのタグ(ノード)が一致していた場合、 そのxmlデータの値を返したいと考えています。 xmlは以下の感じです。 タグ名はすべて異なりますが、順番に並んでいます。 <data1>aaa</data1> <data2>bbb</data2> <data3>ccc</data3> 例としては jsでの変数の値がdata1の場合は、 xmlの<data1>の値を取得したいんです。 jsでの変数の値がdata2の場合は、 xmlの<data2>の値を取得したいんです。 そんな事ってできますか? 初心者なもので、とんちんかんな質問かもしれませんが どうか、宜しくお願いいたします。

    • ベストアンサー
    • AJAX
  • intやshortやcharの変数確保時間

    for文などでよく一時変数に for ( int i=0; ・・・ とか for ( short s=0; ・・・ とか for ( char i=0; ・・・ みたいに整数型の変数が使われます。 確か変数の表せる範囲は long>int>short>char だったと思うのですが、変数を確保する時間やメモリサイズに違いはあるのでしょうか? たとえばlong型変数を10万個確保する時間とintとかshortとかcharのそれ とは違いがあるのかなぁと疑問に思いました。

  • C言語のキャストについて

    お世話になります。 CRC-16の計算プログラムをC言語でつくりました。 例えば・・・1F 08 00 00 12 34 なら“1F0800001234”と入力すると【EEC2】と表示するプログラムです。 ただ・・・.Net SDKでコンパイルするとできたのですが、Visual C++2008でコンパイルするとエラーが出てしまいます。 (48) : error C2664: 'strlen' : 1 番目の引数を 'unsigned char [256]' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 (52) : error C2664: 'strtol' : 1 番目の引数を 'unsigned char [3]' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 型変換が必要ってことまではわかったのですが・・・必要なのはわかって行き詰まり状態です。。。 どのようしたらよいのでしょうか?ご教授をよろしくお願いします。 ソースは以下の通りです。 #include "stdafx.h" #include <stdio.h> #include <string.h> #include <stdlib.h> unsigned short crc_cal(unsigned short lng, unsigned char *str) { unsigned short crc, i, j, t; t= 0x0000; crc = 0xffff; for (i = 0; i < lng ; i++) { crc ^= (unsigned short) str[i]; t = (unsigned short) str[i]; for (j = 1; j <= 8; j++) { if (crc & 1) { // carry bit on crc = crc >> 1; crc ^= 0xa001; } else { // carry bit off crc = crc >> 1; } } } return crc; } int main(void) { unsigned char str[256],data[128],hexstr[3]; unsigned short crc,CRC,len; while(1) { printf("Please input key (HEX)\n"); scanf("%255s",str); hexstr[2]='\0'; for(len=0; len<(strlen(str)/2) ;len++) { hexstr[0]=str[len*2]; hexstr[1]=str[len*2+1]; data[len]=(unsigned char)strtol(hexstr, NULL, 16); } crc = crc_cal(len,data); CRC = (crc>>8) | (crc<<8); printf("\nCRC16 = %04X\n\n", CRC); } return 0; }

  • C#のキャスト?

    C#でのキャスト(?)で困ってます。 うまく説明できないので、下にCっぽい処理を書きます。 struct _hoge{   int i;   char c[4];   double d; }; void f(){   BYTE data[16];   stream.read(data);  // 何かから16Byte読み込み   _hoge *st = (_hoge*)data; // ←ここ   TRACE("%d,%c,%f",data->i,data->c[0],data->d); } //(結構いいかげんです) 上記処理のように、BYTEの配列で取得したデータを「struct _hoge」の型にキャストしてそれぞれの要素を取り出す、ということをC#で実現したいのですがMSDNやWebを結構探したのですがわかりませんでした。(何で検索していいのかがわかりませんでした・・・) 実現方法(もしくは検索キーワード)がわかる方、教えてください。