• ベストアンサー

数値をuchar型に入れるには???

(1)int num = 255;  uchar c; ~~~  c = num;  printf("%x",c);  で表示すると0xFFが表示される? (2)int num = 256;  uchar c; ~~~  c = num;  printf("%x",c);  の場合もprintfで表示すると0x00が表示される? 上記の場合にuchar[2]の配列に、  uchar[1] = 0x01 uchar[0] = 0x00  と入れる場合にはどうすればよいでしょうか? 宜しく御願いします。

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

  • ベストアンサー
  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.2

※方法1 uchar c[2] ; *(short *)c = 256 ; ※方法2 c[0] = num % 256 ; c[1] = num / 256 ; ※方法3 c[0] = num & 0xff ; c[1] = (num >> 8) & 0xff ; ※方法4 #1と同じ typedef union NUM_u { int n ; uchar c[sizeof(int)] ; } NUM_t ; ((NUM_t *)c)->n = 256 ;

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

その他の回答 (1)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

いろいろな方法があります。 以下は、ほんの一例です。 #include <stdio.h> typedef unsigned char uchar; typedef union { int n; uchar c[2]; } U; int main(void) { U u; u.n = 256; printf("%02x %02x\n", u.c[1], u.c[0]); return 0; }

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

関連するQ&A

  • opencvで特定の座標を指定しその座標の色変換

    #include <cv.h> #include <highgui.h> #include <stdio.h> /* グローバル変数 */ CvFont font; IplImage *img; int num1=0; int num2=0; int num3=0; int num4=0; /* プロトタイプ宣言 */ void on_trackbar1 (int val1); void on_trackbar2 (int val2); void on_trackbar3 (int val3); void on_trackbar4 (int val4); int main (int argc, char *argv[]) { img = cvLoadImage ( "bgr.jpg", CV_LOAD_IMAGE_COLOR); cvInitFont (&font, CV_FONT_HERSHEY_DUPLEX, 1.0, 1.0); cvNamedWindow ("Image", CV_WINDOW_AUTOSIZE); cvCreateTrackbar ("X", "Image", 0, 255, on_trackbar1); cvCreateTrackbar ("Y", "Image", 0, 255, on_trackbar2); cvCreateTrackbar ("COLOR", "Image", 0, 255, on_trackbar3); cvCreateTrackbar ("-", "Image", 0, 100, on_trackbar4); cvShowImage ("Image", img); int x,y; uchar p[3]; for (y = 0; y < img->height; y++) { for (x = 0; x < img->width; x++) { p[0] =((uchar*)(img->imageData + img->widthStep*num2))[num1*3]; // B p[1] =((uchar*)(img->imageData + img->widthStep*num2))[num1*3+1]; // G p[2] =((uchar*)(img->imageData + img->widthStep*num2))[num1*3+2]; // R p[0] = num3; p[1] = num3; p[2] = num3; } } cvWaitKey (0); cvDestroyWindow ("Image"); cvReleaseImage (&img); return 0; } /* コールバック関数 */ void on_trackbar1 (int val1) { num1 = val1; char str[64]; printf ( "X=%d Y=%d C=%d -=%d\n", val1, num2, num3, num4); } void on_trackbar2 (int val2) { num2 = val2; char str [64]; printf ( "X=%d Y=%d C=%d -=%d\n", num1, val2, num3, num4); } void on_trackbar3 (int val3) { num3 = val3; char str [64]; printf ( "X=%d Y=%d C=%d -=%d\n", num1, num2, val3, num4); } void on_trackbar4 (int val4) { num4 = val4; char str [64]; printf ( "X=%d Y=%d C=%d -=%d\n", num1, num2, num3, val4); } このプログラムで特定の座標の色変換をしたいのですがうまくいきません。 トラックバー1でX座標 トラックバー2でY座標 トラックバー3で変更後の色 を指定します。 実行すると画像は表示されますがトラックバーを動かしても変化がありません。トラックバーを動かした時にmain関数に戻れば良いと思い、思いつく限り試しましたが上手くいきません。 どなたかアドバイスお願いします。

  • バッファオーバーランの危険性検出について

    下に示すmsg_file.txtの内容を読み込んで表示するプログラムを使ってバッファオーバーランの危険性を検出するプログラムを作りたいのですが、どのように書き換えたら良いでしょうか。 プログラムソース 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #define FILEPATH "msg_file.txt" 6 7 int main(); 8 void vuln(const char* line); 9 void stack_dump(void* ptr, int counts); 10 void hello(); 11 12 int main() 13 { 14 char linebuf[1024]; 15 FILE *fp; 16 long mark1 = 0x11111111; 17 memset(linebuf, 0, sizeof(linebuf)); 18 19 fp = fopen(FILEPATH, "r"); 20 fgets(linebuf, sizeof(linebuf)-1, fp); 21 fclose(fp); 22 23 vuln(linebuf); 24 25 printf("------------- end of main() -------------\n"); 26 } 27 28 void vuln(const char* line) 29 { 30 char msg[20]; 31 long mark2 = 0x22222222; 32 memset(msg, 0, sizeof(msg)); 33 34 strcpy(msg, line); 35 36 stack_dump(&mark2, 13); 37 38 printf("INPUT[%s]\n", msg); 39 } 40 41 void stack_dump(void* ptr, int counts) 42 { 43 int i; 44 unsigned long *ulong_ptr = (unsigned long *)ptr; 45 unsigned char uchar_buf[4]; 46 47 printf("-----------------------------------------\n"); 48 printf(" address | long var | +0 +1 +2 +3 | 0123\n"); 49 printf("-----------------------------------------\n"); 50 for(i=0; i<counts; i++) { 51 printf(" %08x| %08x", &ulong_ptr[i], ulong_ptr[i]); 52 memcpy(uchar_buf, &ulong_ptr[i], sizeof(uchar_buf)); 53 printf(" | %02x %02x %02x %02x", 54 uchar_buf[0], uchar_buf[1], uchar_buf[2], uchar_buf[3]); 55 if(uchar_buf[0]<32 || uchar_buf[0]>126) uchar_buf[0] = '.'; 56 if(uchar_buf[1]<32 || uchar_buf[1]>126) uchar_buf[1] = '.'; 57 if(uchar_buf[2]<32 || uchar_buf[2]>126) uchar_buf[2] = '.'; 58 if(uchar_buf[3]<32 || uchar_buf[3]>126) uchar_buf[3] = '.'; 59 printf(" | %c%c%c%c\n", 60 uchar_buf[0], uchar_buf[1], uchar_buf[2], uchar_buf[3]); 61 } 62 printf("-----------------------------------------\n"); 63 } 64 65 void hello() 66 { 67 printf("+----------+\n"); 68 printf("| HELLO! |\n"); 69 printf("+----------+\n"); 70 exit(0); 71 }

  • 配列要素内の数値

    #include <stdio.h> int main(void) { int arr[1]={123456789}; int *x[1]; *x = arr; printf("%d ",*(x[0])); /* 123456789 と表示*/ return 0;} 実行すると123456789と表示されるまでは分かるのですが、*(x[0])の部分を別の書き方にして、arr[0]に入ってある「123456789」という数値の千の値である6という数値のみを取り出して、表示することは可能なのでしょうか?(6000と取り出したいのではなく、6として取り出したい) 次のように数値を文字列の一つ一つを扱うかのように、扱いたいのです。*(x[0])の部分の変更だけで6を取り出せるような方法はありますか? #include <stdio.h> int main(void) { char *arr[]={"pen"}; printf("%c\n",*(arr[0]+0)); printf("%c\n",*(arr[0]+1)); printf("%c\n",*(arr[0]+2)); return 0;}

  • ファイルから16進数文字列として読み込めない

    例えば 2b7e151628aed2a6abf7158809cf4f3c のうようなファイルを 2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c ------(*) のような16個の配列からなる数字列として考えて読み込むにはどうすればよいでしょうか?うまく思いつきません。 なお、 unsigned char num[16]; (上記の数字列を入力) for(int i=0; i<16; i++) printf("%x", num[i]); を実行すると(*)のように表示されるようにしたいです。 詳しい方よろしくお願いします。

  • C言語のプログラミング配列・forを使った検索

    C言語のプログラミングで、配列とforを使った検索の表し方がわかりません。 numにはキーボードから任意の数字を入力し、 1ならば25、2ならば30、、、といったように 対応する数字を表示させ、1行目にない数字が入力された時は 「NoData」と表示させたいのですが、上手くいきません; 本当はもっと配列が多いのですが4つでやってみると #include <stdio.h> main() { int data[2][4]{{1,2,3,4},{25,30,45,50}} , num , i ; printf("num?"); scanf(&num); for(i=0; i>4;i++) if(num== data[0][i]){ printf("number is \n",data[1][i]);} else {printf("NoData\n"); } return0 ; } こうかと思ったのですが上手くいきません、、、 どなたかお願いします!

  • C言語のコードについて

    C言語の問題なのですか、作成したのですが内容がわからないです。 コードをわかりやすく解説していただけると嬉しいです。 #include <stdio.h> void printBinary(unsigned char num) { int i ; /*①上位ビットから順に表示する*/ for(i = 7 ; i >= 0; i--) { /*②シフトとマスクを使用しています。*/ printf("%d", (num>>i) &0x01 ); } printf("\n"); } int main(void) { unsigned char num1 = 0xD2;/*11010010*/ unsigned char num2 = 0x5E;/*01011110*/ printf("0xD2 : "); printBinary(num1); printf("0x5E : "); printBinary(num2); return 0; }

  • C言語 逆順の配列の仕方を教えてください

    今、大学でC言語の課題をやっています。サンプルが与えられています。 その課題は、配列の逆順です。 for文を使って、実行結果は以下のようにならなければならなく、「並び替えの結果は再び num1, num2 に保存される」という条件なのですが、逆順になるにはどのようなプログラムを組めば良いのでしょうか? ソースの「 /* ここに処理を書く */」にプログラムを書かなければいけないのですが、まったくの初心者でわかりません。誠にお手数ですが、教えていただければ幸いです。宜しくお願いいたします。 -----実行結果----- C:\c_lang>reverse --- before --- 2 4 9 10 5 3 1 7 8 6 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 --- after --- 6 8 7 1 3 5 10 9 4 2 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 -----以下ソース----- #include <stdio.h> void print_num( int *num, int len ); void reverse_num( int *num, int len ); int main( void ) { int num1[10]={2,4,9,10,5,3,1,7,8,6}; int num2[15]={1,2,3,4,5,6,7,8,9,10, 11,12,13,14,15}; printf("--- before ---\n"); print_num( num1, 10 ); print_num( num2, 15 ); /* 逆順に並べ替え */ reverse_num( num1, 10 ); reverse_num( num2, 15 ); printf("--- after ---\n"); print_num( num1, 10 ); print_num( num2, 15 ); return 0; } void print_num( int *num, int len ) { int i; for( i=0; i<len; i++ ){ printf( "%d ", num[i] ); } printf("\n"); } void reverse_num( int *num, int len ) { /* ここに処理を書く */ } -----ソースここまで-----

  • 引数に二重配列のある関数について

    void calc(int *a,int b,int c){ a[0]=b+c; a[1]=b-c; } void main(void){ int x[2]; int y=2,z=5; calc(x,y,z); printf("x[0]=%d,x[1]=%d\n",x[0],x[1]); } 上のように引数が普通の配列の関数ならできるのですが, 引数が下のような多重配列になるとエラーが出てしまいできません。 void keisan(int **a,int b,int c){ a[0][0]=b+c; a[0][1]=b-c; a[1][0]=b*c; a[1][1]=b/c; } void main(void){ int x[2][2]; keisan(x,6,2); printf("x[0][0]=%d,x[0][1]=%d\n",x[0][0],x[0][1]); printf("x[1][0]=%d,x[1][1]=%d\n",x[1][0],x[1][1]); } 引数に多重配列を使った場合の関数の作り方について教えてください. お願いいたします.

  • Cのポインタについて(関数への値渡し)

    C言語のポインタに関する質問です。関数に引数を渡す方法として以下の誤ったswap関数でなぜだめなのかいまいち得心できません。わかりやすくかみくだいて説明していただけると有り難いです。 できましたら、トレースともうしますか、変数の値の動きを詳細に段階的にプログラムの流れに沿って追っていって、だからこうなんだよ、みたいな解説がいただけたら有り難いです。わがままいってすみません。 /* 誤ったswap関数の宣言 */ void swap(int x, int y); int main(void) { int num1 = 5; int num2 = 10; printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); printf("変数num1とnum2の値を交換します。¥n", num1); swap(num1, num2); printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); return 0; } /* 誤ったswap関数の定義 */ void swap(int x, int y) { int tmp; tmp = x; x = y; y = tmp; } ---------- /* swap関数の宣言 */ void swap(int *pX, int *pY); int main(void) { int num1 = 5; int num2 = 10; printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); printf("変数num1とnum2の値を交換します。¥n", num1); swap(&num1, &num2); printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); return 0; } /* swap関数の定義 */ void swap(int *pX, int *pY) { int tmp; tmp = *pX; *pX = *pY; *pY = tmp; }

  • C言語 入力した数値の平均値の近似値

    n個の数値を入力して、その平均値にもっとも近い値を求めよ。(double型の配列を用いること) nは実数データの前に最初に入力するものとする。 必要ならばnは100以下と仮定せよ。 答えは指数なしの表現で、欄の最小幅は8とし、精度は3とする。 という問題なのですが、作ってみたプログラムでは正しく動作できませんでした。 どこが違うのか教えてください。 以下が私の作ったプログラムです。 _____________________________________________________________________________________________________________________ #include <stdio.h> int main (void) { int i,n; double c[100],sum,avg,num1,num2,ans; sum=0.0; scanf("%d",&n); for(i=0;i<n;i=i+1) { scanf("%lf",&c[i]); sum=sum+c[i]; } avg=sum/n; num1=avg-c[0]; if(num1<0){ num1=num1*(-1); } for(i=1;i<n;i=i+1){ num2=avg-c[i]; if(num2<0){ num2=num2*(-1); } if(num1>num2); num1=num2; } printf("%8.3f",num1); return(0); } _____________________________________________________________________________________________________________________ ちなみに「3 3.0 5.0 11.0」と入力すれば「5.000」となるはずなのですが、 私のでは「4.667」と表示されてしまいます。 よろしくお願いします。

このQ&Aのポイント
  • 印刷が斜めにずれるトラブルにお困りですか?ブラザー製品のDCP-L2550DWで発生するこの問題について解決策をご紹介します。
  • パソコンのOSや接続方法など、お使いの環境についてもお知らせください。
  • また、関連するソフトやアプリ、電話回線の種類なども教えていただけると、より具体的なサポートが可能です。
回答を見る