• ベストアンサー

unsigned long 'aufx' から C Strings "aufx" への方法

kmb01の回答

  • ベストアンサー
  • kmb01
  • ベストアンサー率45% (63/138)
回答No.1

unsigned long x=0x61756678; char s[5]; unsigned char mask=0xff; s[0] = (x>>24)&mask; s[1] = (x>>16)&mask; s[2] = (x>> 8)&mask; s[3] = x&mask; s[4] = '\0'; とかでどうでしょうか。

psychesine
質問者

お礼

ありがとうございます。 できました。

関連するQ&A

  • C++ basic_ostreamの拡張

    UTF-16文字列を扱うためのostreamを用意したいのですが、wcoutの代わりに、unsigned shortを用いたostreamを使いたいと思いました。 そこで、basic_ostreamのクラスのunsigned short型のインスタンスを作ったのですが、以下のエラーが出てしまってコンパイルが出来ませんでした。 「error C2296: '<<' : 無効です。左オペランドには型 'u16ostream (__cde cl *)(void)' が指定されています。」 「error C2297: '<<' : 無効です。右オペランドには型 'u16char *' が指定 されています。」 コンパイラはVC++2008です。 それとついでですが、通常通りwcoutを使う時みたいに、localeを設定する必要はあるのでしょうか? 回答、よろしくお願いします。 /* 以下ソースコード */ #include <iostream> typedef unsigned short u16char; typedef basic_ostream<u16char> u16ostream; int main() { u16ostream ucout(); u16char* str = (u16char*)(L"ああ"); ucout << str << '\n'; return 0; }

  • unsigned int型について

    C言語初心者です。 unsigned int型に関する質問です。 --------------------------------- #include <stdio.h> int main(void) { unsigned int in1 = 10; unsigned int in2 = -10; unsigned char ch1 = 10; unsigned char ch2 = -10; printf("in1 = %d\n", i); printf("in2 = %d\n", i); printf("ch1 = %d\n", ch1); printf("ch2 = %d\n", ch2); return 0; } --------------------------------- 上記のプログラムを作成して実行すると、結果は以下の通りです。 [実行結果] in1 = 10; in2 = -10; ch1 = 10; ch2 = 246; 変数in2の値を表示した結果に関してですが、 unsigned int型にも関わらず負の値「-10」が表示されるのは 何故でしょうか?

  • Cで書かれたコードの文字マクロ部分がわかりません。

    下記に示す、Cのサンプルプログラムの文字マクロの部分がわからず、困っています。 ソースの実行環境の違いを吸収するための部分であることはわかるのですが、どうしてこのようにて定義されたのかがわかりません。 特に、 ●__MINGW32__とは何か? ●#if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__)のところで、なぜ||と&&を併用しているのか。&& !defined(__MINGW32__)がどうして必要なのか? ●C##UI64、C##UL、C##ULLはそれぞれ何なのか? ●__arch64__は何か?なぜ必要なのか? ●なぜ、下のソース(文字マクロ部分)のdefineの流れになったのか? のあたりがわかりません。よろしくお願いします。 ---------------------------------------------------------------------- #if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__) typedef unsigned __int64 u64; #define U64(C) C##UI64 #elif defined(__arch64__) typedef unsigned long u64; #define U64(C) C##UL #else typedef unsigned long long u64; #define U64(C) C##ULL #endif ----------------------------------------------------------------------

  • R8Cマイコンの乗算

    R8C34Mを使っています。 例えば下記のコードを実行したら  unsigned long kai;  unsigned int xx;  unsigned int yy; xx = 0x07d0;  //10進で2000 yy = 0x0064;  //10進で100 kai = xx * yy; kaiは 0x30d40 となるはずが、0x0d40 でした。 kai = (unsigned long)xx * yy; と書き直したら、うまくいきました。 答えが2バイトを超えるのが分かっていたのでkaiはlong長にしました。 どうして右辺もキャストでlong長にしないといけないのでしょうか? また、下記のようにkaiをint長、xx,yyをchar長にした場合は、 kaiは意図する値の0x4e20 になりました。  unsigned int kai;  unsigned char xx;  unsigned char yy; xx = 0x00c8;  //10進で200 yy = 0x0064;  //10進で100 kai = xx * yy; どうして後者の場合はうまくできて、前者の場合はキャストしないといけないのでしょうか? この辺ご存知の方ご教授願います。

  • Cソースのコンパイルのワーニングについて

    C初心者です。 お願いします。 Cソースをコンパイルしたのですが、ワーニングがでて、どうすればいいのか手も足もでません… 詳しい方ご教授ねがいます。 ワーニング内容 warning #4232-D:conversion from "DATA_T *" to a more strictly aligned type "DATA_BYTE *" may cause misaligned access sizeof(DATA_T),(DATA_BYTE *)data_t 型の定義に関してだと思うのですが、どうしていいかわかりません… キャストがうまくいってないような… 変数の定義は以下です。 typedef unsigned char DATA_BYTE_U typedef DATA_BYTE_U * DATA_BYTE typedef sutruct{ char head char dat char tail }DATA_T DATA_T *data_t OSはUNIXです。 情報が足りなければ教えてください。 よろしくお願いします。

  • Cの共用体を使ったローテートについて

    独習Cで独学中です。 Cでローテート関数を作る下記の模範解答があり、動作も確認済みですが、どうしてそうなるのかイマイチ理解できません。 教えてください。 ========ここから=================================== #include <stdio.h> void rotate(unsigned char *c); int main(void) { unsigned char ch; int i; ch = 1; for(i=0; i<16; i++) { rotate(&ch); printf("%u\n", ch); } return 0; } void rotate(unsigned char *c) { union { unsigned char ch[2]; unsigned u; } rot; rot.u = 0; /* 16ビットをクリア */ ---(1) rot.ch[0] = *c;          ---(2)  /* 整数を左にシフト */ rot.u = rot.u << 1;        ---(3) /* ビットがc[1]にシフトしたかどうか確認する。 シフトしていれば、OR演算を実行して他方の端に戻る */ if(rot.ch[1]) rot.ch[0] = rot.ch[0] | 1; *c = rot.ch[0]; } ========ここまで============================== 私の考えでは (1)のときにビットの状態は 0000 0000 0000 0000 (2)により ch[0]にchの値が渡されるので 0000 0001 0000 0000 <-ch[0]->|<-ch[1]-> (3)で左に1シフトされると 0000 0010 0000 0000 となり、i=1のときch[0]が2、以後インクリメントごとに4,8,・・・,128まではわかります。 その後、ビットからはみ出した1が最下位に戻ってくるところがよくわかりません。 コメント行の「c[1]」はビット番号のことではなくてch[1]の間違いなのか? だとしてもif文のch[1]は0ではないか???と悩んでます。 解説をどうかよろしくお願いします!

  • c言語による2のべき乗

    右、左シフトと2のべき乗による乗除算が同じことを証明するプログラムを作っているのですがうまくいきません。 プログラムを載せるのでどこが間違っているのかご教授お願いします。 #include <stdio.h> int count_bits(unsigned x){ int count = 0; while(x){ if(x&1U) count++; x>>=1; } return(count); } int int_bits(void){ return(count_bits(~0U)); } void print_bits(unsigned x){ int i; for(i=int_bits()-1; i>=0; i--) putchar(((x>>i)&1U) ? '1' : '0'); } int main(void){ unsigned nx, no, n1, n2; printf("非負の整数を入力してください:"); scanf("%u", &nx); printf("何ビットシフトしますか?:"); scanf("%u", &no); n1=nx * (2^no); n2=nx / (2^no); printf("\n整数 = "); print_bits(nx); printf("\n左にシフトした値 = "); print_bits(nx << no); printf("\n右にシフトした値 = "); print_bits(nx >> no); printf("\n2のべき乗で乗算した値 = "); print_bits(n1); printf("\n2のべき乗で除算した値 = "); print_bits(n2); putchar('\n'); return(0); }

  • C++のnew演算子で動的確保

    new()を初めて使ってみました。 エラーは無かったけど、間違いがあったら教えてください。 #include <iostream.h> main(){ int n = 0; char* str = "mojisuufumei"; char* myValue; while(!str[n])n++; myValue = new char[n+1]; strcpy(myValue, str); cout << myValue; delete []myValue; } char*型のmyValueを動的確保したつもりです。 myValue[0], myValue[1], … のそれぞれの値を unsignedにして宣言したい場合はどうしたらいいんですか? #include <iostream.h> main(){ int n = 0; char* str = "mojisuufumei"; unsigned char* myValue; while(!str[n])n++; myValue = new unsigned char[n+1]; strcpy(myValue, str); cout << myValue; delete []myValue; } だと、strcpy()のとこでコンパイルエラーでした。

  • VBAで符号無し整数

    BMPファイルを読み込んで配列に書き出すプログラムを作ろうとしています。 BMPファイルの構造は http://www.geocities.co.jp/Playtown-Knight/6845/sd_doc/format_windib.html のページに書かれてあるのですが、 typedef unsigned short WORD typedef unsigned long DWORD typedef unsigned char BYTE typedef long LONG などの「符号無し整数」で定義された変数を使う必要があります。 http://homepage1.nifty.com/rucio/main/kiso/DataType.htm のページにあるようにVBではUlongやUshortが使えるようなのですが、 VBA上で Dim bfSize As ULong とすると、「ユーザー定義型は定義されていません」 と表示されます。 参照設定のところで何か設定を行えば良いと思うのですがどこを設定すれば良いのでしょうか? もし、使えないとして、VBAで2バイトや4バイトを数値として読み込むにはどうすれば良いでしょうか?

  • マイコンH8-3664 走行カー C言語プログラム改良

    SW0がONで3秒間前進して停止 SW0がOFFの後、再度ONで3秒間前進して停止  するプログラムです! これを、 3秒間前進後、3秒右旋回(右モーターのみ回転)後、3秒間前進、3秒右旋回を繰り返し、元の位置に戻るというプログラムに改良せよ!というのですが? /**************************************************************/ #include <stdio.h> #include <sysio.h> /*タイマーA*/ #define TMA (*((volatile unsigned char *)0xFFA6) /*割り込み*/ #define IENR1 (*((volatile unsigned char *)0xFFF4)) #define IRR1 (*((volatile unsigned char *)0xFFF6)) #define PDR8 (*((volatile unsigned char *)0xFFDB)) #define PCR8 (*((volatile unsigned char *)0xFFEB)) long count = 0; long x = 0; void interrupt timer( ) { IRR1 &= ~0x40 ; if( count == 300 ) { x = 1 ; count = 0 ; } else { count++; } } void main( ) { unsigned char a; TMA = 0x03 ; IENR1 |= 0x40 ; PCR8 = 0x0f ; while(1){ a = PDR8 >> 4 ; if( x == 0 && a == 0x0e ) { PDR8 = 0x0a ; _ei( ) ; } else if( x == 1 ) [ PDR8 = 0x00; _di( ) : if (( PDR8 >> 4) == 0x0f) { x = 0 ; } } } } /**************************************************************/ 尚、SW はプルアップされている!