• ベストアンサー

C言語:アウトプット引数のキャストについて

以下のサンプルソースのように、(1)の場合、出力結果が24にならないのはなぜでしょうか?基礎的な質問だと思いますがよろしくお願いします。 --------------------------------------- サンプルソース #include <stdio.h> int getValue(unsigned short* us){ *us = 24; } main(){ int ret = 0; int intVal = 0; unsigned short usVal = 0; /* (1)int型のintValをunsigned short型にキャストした場合 */ ret = getValue((unsigned short*)&intVal); printf("%d\n", intVal); /* (2)unsigned short型のusValをそのまま引数に渡した場合 */ ret = getValue(&usVal); printf("%d\n", usVal); } ---------------------------------- 出力結果 1572864 ←(1)の結果 24 ←(2)の結果 -----------------------------------

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

  • ベストアンサー
  • jgk
  • ベストアンサー率75% (104/138)
回答No.2

CPUがビッグエンディアンだからでしょうね。 00 00 00 00(0x00000000=0) ↓00 18(0x0018=24)を書き込む 00 18 00 00(0x00180000=1572864) リトルエンディアンだとこう。 00 00 00 00(0x00000000=0) ↓18 00(0x0018=24)を書き込む 18 00 00 00(0x00000018=24)

BIGMON
質問者

お礼

ありがとうございました。当方勉強不足でした。アウトプットの引数のキャストには気をつけます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>リトルエンディアンでintが32bitでしたらそうなるかと。 きゃー(^^;;なにねぼけてるんでしょ! ビッグエンディアンですよね。

BIGMON
質問者

お礼

おっしゃるとおりintが32bitです。OSはwindows2000です。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

OSやプラットフォームがかかれていないのですが、 リトルエンディアンでintが32bitでしたらそうなるかと。 1572864 = 0x180000 24 = 0x18 ですから。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語とC++の相違点?

    printf("sizeof(int)= %u\n", (unsigned)sizeof(int)); printf("sizeof(unsigned)= %u\n", (unsigned)sizeof(unsigned)); の結果がVisual C++では共に4なのですが、C言語の扱っている本では 共に2になっています。 これが単なるミスプリなのか、C++とC言語の違いなのか教えていただけますか? 回答よろしくお願いします。

  • 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言語 型変換について 下記のように文字コードは、unsigned int型('B')をunsigned char 型(str[1] ) 格下げする型変換する規則を教えてください。 *質問ソースプログラム: int main(void) { char str[4]; /* 文字列を格納する配列 */ str[0] = 'A'; /* 代入 */ str[1] = 'B'; /* 代入 */ ・・・・・・ printf("size B %u\n",(unsigned)sizeof('B')); printf("size str[1] %u\n",(unsigned)sizeof(str[1])); * 実行結果 size B 4 size str[1] 1

  • fscanf()【C言語】

    テキストファイルをうまく読み込んでくれません。 どうかご教示お願いいたします。 環境 Windows7 Borland C++ 5.5.1 for Win32 status.txtの内容 1.50,40.0 1.55,45.0 1.60,50.0 1.65,55.0 1.70,60.0 1.75,65.0 1.80,70.0 1.85,75.0 1.90,80.0 プログラムの内容 #include<stdio.h> #include<stdlib.h> #include<string.h> int main(){ FILE *filepointer; double s[10],w[10]; int i=0,ret; if((filepointer=fopen("status.txt","rt"))==NULL){ printf("file open error!!\n"); exit(1); } printf("%X\n",filepointer); while((ret=fscanf(filepointer,"%f,%f",&s[i],&w[i]))==2){ i++; printf("%d %f %f\n",ret,s[i],w[i]); } fclose(filepointer); return 0; } 出力結果 40E714 2 0.000000 0.000000 2 0.000000 0.000000 2 0.000000 0.000000 2 0.000000 0.000000 2 0.000000 0.000000 2 0.000000 0.000000 2 5.121811144940079976000000000000000000000e+303 0.000000 2 0.000000 0.000000 2 0.000000 0.000000

  • C言語の文字列一部取得について

    プログラム初心者です。現在、下のようなプログラムを作成して文字列をprintf出力しております。現状、文字列データの一部(何バイト目からここまでとか)を他の場所に抽出や取得をしたいのですが、それが出来なく大変困っています。 文字列の取得例) aaaa.aa|xxx.xx|yyyy.yy|iiii 今、取得したい部分はx,y,iの部分で、文字数は100文字出力させております。 int i,loop; char sendValue[100]; char readValue[100]; int ret; int loopCnt; loopCnt = 0; ret = 0; strcpy(sendValue,sendMsg); printf("send\n"); for(i=0;i<len;i++){ write(fd,&sendValue[i],1); usleep(50000); } while(1){       ret = read(fd,readValue,100); printf("read-ret:%x\n",ret); if(ret!=0xffffffff){ printf("readValue(%s):",ret); for(i=0; i<ret; i++){ printf("%02X ",readValue[i]); } printf("\n"); return 0; } こんな感じです。ご教示お願いいたします。

  • キャスト

    double i; for(i = 1.0; (int)i<=10; i+=0.1){ printf("%lf %d\n",i,(int)i); } 上のようなソースで 1.0 から 10.9 まで 0.1 刻みで小数を表示しようとしたのですが、 条件式 (int)i<=10 にも関わらず出力結果に 11.0 が含まれてしまうのは何故でしょうか。

  • C言語

    以下の出力結果はどうなりますか? 教えてください。 #include <stdio.h> #include <stdib.h> int main (void){ int n,f; n=792; f=2; while(f*f<=n){ while(n%f==0){ printf("%d",f); n=n/f; } f++; } if(n !=1) printf("%d",n); printf("\n"); return 0; }

  • C言語キャスト

    こんにちは Windows7+Cygwinで次のコードの挙動がおかしいです。バグでしょうか void main() { double a = 33.33; int b; a *= 10; a *= 10; b = (int)a; printf("%d\n", b); } 結果:3333と表示するはずが3332になる 詳しい方いましたらよろしくお願いします。

  • C言語について

    #include <stdio.h> int main(void) { printf("123456\tABC DEFGHIJK\n"); printf("2006/4/14\n"); printf("programing\n"); } のprintfをすべてputsに書き換えてコンパイル・実行すると、 #include <stdio.h> int main(void) { puts("123456\tABC DEFGHIJK\n"); puts("2006/4/14\n"); puts("programing\n"); } になると思うんですけど、そのputsを用いて上のprintfを用いたプログラムと同じ出力を得るにはどのようなプログラムに変えればいいのでしょうか?

  • C言語について

    次のような問題です。 問 自然数nを入力し、nを3で割って割り切れるかどうかを判定し結果を表示する。「割り切れる」、「1余る」、「「2余る」のいずれかが入るものとする。 このようなものをつくりました。 #include<stdio.h> int main(void) { int n; printf("自然数:"); scanf("%d",&n); if(n==0){ printf("割り切れる\n"); }else if(n==1){ printf("1余る\n"); }else{ printf("2余る"); } return(0); } これで合っているかよろしくお願いします。