• ベストアンサー

WCHAR_MAXがUnsignedでない?

Linux, BSD問わず、C/C++で、なぜWCHAR_MAXとWCHAR_MINはsignedな数で #defineされてるんでしょうか? wchar_tはunsigned intと等価なのに... どんな理由があるんでしょうか。それともただのバグ(そんな事ないと思いますが)?

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

  • ベストアンサー
  • 500cii
  • ベストアンサー率50% (14/28)
回答No.2

http://ja.wikipedia.org/wiki/%E3%83%AF%E3%82%A4%E3%83%89%E6%96%87%E5%AD%97 (これの「内部表現」を見てください) これを見る限りsignedかunsignedかは実装依存かと思われます。

stosh666
質問者

お礼

ありがとうございます。signedかどうかは決められてないんですね。

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

その他の回答 (2)

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

既に回答はありますが, 規格上も wchar_t は整数型 (「int型」ではない) であることしか保証されていません. 特に「符号付きか符号なしか」については, 規格では一切触れられていません.

stosh666
質問者

お礼

ありがとうございます。signedかどうかは決められてないんですね。

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

>wchar_tはunsigned intと等価なのに... wchar_tはunsigned intと等価とは決まってませんけど。 FreeBSD 9だとwchar_tの定義は以下のようになってます(必要な部分だけ抜粋) typedef int __ct_rune_t; /* arg type for ctype funcs */ typedef __ct_rune_t __wchar_t; /* wchar_t (see above) */ typedef __wchar_t wchar_t;

stosh666
質問者

お礼

ありがとうございます。ただのintだったとは。

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

関連するQ&A

  • secが・・確認お願いできませんか?

    秒数が出ないのですがどこが違うのでしょうか? #define TCNT0 (*(volatile unsigned int *)0xffff68) #define GRA0 (*(volatile unsigned int *)0xffff6a) #define GRB0 (*(volatile unsigned int *)0xffff6c) #define TCR0 (*(volatile unsigned char *)0xffff64) #define TIOR0 (*(volatile unsigned char *)0xffff65) #define TIER0 (*(volatile unsigned char *)0xffff66) #define TSR0 (*(volatile unsigned char *)0xffff67) #define TSTR (*(volatile unsigned char *)0xffff60) #define ITU_CLOCK8 3 #define ITU_CLEAR_GRA 32 #define ITU_IE_IMFA 1 #define DI asm( "orc.b #0xc0,ccr" ) #define EI asm( "andc.b #0x3f,ccr" ) void start_itu0(); void int_imia0(void) __attribute__ ((interrupt_handler)); int cnt = 0, sec = 0, min = 0, hour = 0; char str[] = "timer 00:00:00"; int main(void) { lcd_init(); lcd_puts(str); start_itu0(); EI; for(;;) { if (cnt >=100) { cnt = 0; sec++; if (sec >=60) { sec = 0; min++; if (min >= 60) { min = 0; hour++; if (hour >= 24) hour = 0; } str[6] = '0' + hour /10; str[7] = '0' + hour %10; str[9] = '0' + min /10; str[10] = '0' + min %10; str[12] = '0' + sec /10; str[13] = '0' + sec %10; lcd_home(); lcd_puts(str); } } } return 0; }

  • 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 .. ±6.80564774407 * 1038 double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 long double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038

  • VC++2008でのサンプルプログラムのビルド

    VC++2008を使用してWin32APIを使ったプログラムを動かしたいと思っている者です。 これまでC言語については多少学んできましたがC++を使用するのは初めてです。 まずはサンプルプログラムを動かそうと思い以下のソースを入力しました。 #include <windows.h> #include <tchar.h> int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd) { MessageBox( NULL, _T("Hello World"), _T("メッセージ"), MB_OK ); return 0; } そしてこれをビルドしてみたところエラーメッセージがでてしまいうまくビルドできませんでした。 参考にしているHPはVC++2008での作業を推奨していたので、動作環境の違いなどではないと思うのですが… 初期設定等の問題になるのでしょうか?解決策があれば教えていただきたいです。 以下が表示されるエラーメッセージです。 1>1.obj : error LNK2028: 未解決のトークン (0A000044) "extern "C" int __stdcall MessageBoxW(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBoxW@@$$J216YGHPAUHWND__@@PB_W1I@Z) が関数 "extern "C" int __cdecl MessageBox(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBox@@$$J0YAHPAUHWND__@@PB_W1I@Z) で参照されました。 1>1.obj : error LNK2019: 未解決の外部シンボル "extern "C" int __stdcall MessageBoxW(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBoxW@@$$J216YGHPAUHWND__@@PB_W1I@Z) が関数 "extern "C" int __cdecl MessageBox(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBox@@$$J0YAHPAUHWND__@@PB_W1I@Z) で参照されました。 1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\1\Debug\1.exe : fatal error LNK1120: 外部参照 2 が未解決です。

  • 2147483647LのLについて

    処理系:Borland C++ Compiler 5.5 OS  :Windows XP C言語のint型の最大値を知りたくて、_lim.hの 中を覗きました。 #define INT_MAX LONG_MAX /* maximum signed int value */ とあり、上の方に #define LONG_MAX 2147483647L /* maximum signed long value */ とあるのですが、2147483647Lの Lはどういうときに使うのでしょうか。教えてください。

  • #defineについて

    #define STATIC_ASSERT(expr) { \ char __STATIC_ASSERTION[(expr) ? 1 : -1]; \ (void)__STATIC_ASSERTION; \ } /* 符号付き整数の右シフトが算術シフトかどうか */ #define SHIFT_LEFT_SINGNED_USES_SAL \ (((signed int)0xffffffff >> 1) == 0xffffffff) /* 符号無し整数の右シフトが論理シフトかどうか */ #define SHIFT_LEFT_UNSIGNED_USES_SHL \ (((unsigned int)0xffffffff >> 1) == 0x7fffffff) とは一体どういう意味なのでしょうか? なぜ、ブロックの中にchar型が宣言されているのでしょうか? なぜ、(void)とキャストされているのでしょうか? できたらわかりやすくご教授よろしくお願いします。

  • リトルエンディアン→ビッグエンディアン

    (1)リトルエンディアン typedef struct recvData{  int a;  unsigned char b[16]; unsigned char c[8]; unsigned int d[4]; } recvData_t; recvData_t rData; (2)ビッグエンディアン typedef struct sendData{  int a;  unsigned int b[4]; unsigned int c[2]; unsigned int d[4]; } sendData_t; sendData_t sData; 上記のようなリトルエンディアンの構造体の各メンバのデータを、ビッグエンディアンの構造体の各メンバのデータにそれぞれ格納するには どうしたらよいでしょうか?

  • 構造体ポインタ、及び、戻り値のあるマクロ関数の作成方法について

    ●開発環境 [OS] Linux 2.6.9 [コンパイラ] GCC 3.4.6 ●質問 以下のプログラム中のTEST関数を、 マクロ関数(#define)にしたいのですが、 やり方がわかりません。 ご存知の方がいらっしゃいましたら、ご教授願います。 -------------------------------- #include <stdio.h> typedef struct t_str_abc { unsigned int x; unsigned int y; } str_abc; unsigned int TEST( str_abc *kou ); void main(void) { str_abc kouzou; unsigned int ret; kouzou.x = 1; kouzou.y = 2; ret = TEST(&kouzou); printf("ret = %d\n", ret); } unsigned int TEST( str_abc *kou ) { unsigned int state; state = kou->x + kou->y; return state; } --------------------------------

  • 絶対値を含んだ計算の仕方

    (1) b=[b1,b2] とする。 max(|b1|,|b2|)=0 のとき  d max(|b1|,|b2|) ________________ = v = [v1,v2]  d b |v1|+|v2|<=1   ・・・ @ となる。 max(|b1|,|b2|)=0 の条件から、  b1<=0、b2<=0 までしか分かりません。 ここからどうやって、maxの絶対値の微分をして@が導出されるのでしょうか? (2) t=sgn(s)*min(|s|,c)  sgn(s)はsの符号、cは非負の定数 とするとき、 |s-t|=max(0,|s|-c) となる。左辺から右辺が導かれることを証明。  以下、自分で途中までやりましたがうまく解けません。  (i)s>tのとき  |s-t|=s-sgn(s)*min(|s|,c)      (s>0のとき)              =s-min(|s|,c)        =min(0,s-c)    =max(0,c-s)    (s<0のとき)    =-s+min(|s|,c)        =min(0,c-s)    =max(0,s-c)  (ii)t>sのとき  |s-t|=-s+sgn(s)*min(|s|,c)      (s>0のとき)              =-s+min(|s|,c)        =min(0,-s+c)    =max(0,s-c)    (s<0のとき)    =s-min(|s|,c)        =min(0,s-c)    =max(0,c-s)   ここからどうやればいいのでしょうか? 絶対値が絡むと普段使わないので、途端に分からなくなります。 ご回答よろしくお願いします。

  • H8 外部バスのデータアクセス

    H8 外部バスのデータアクセス ルネサスのH8マイコン初心者です。(C言語も初心者です) 外部バスのCS1(0x200000)に512KBのSRAMが繋がっているのですが、 HEWのセクションを変更せず、直接SRAMに対して読み書きしたいと思っています。 バスコントローラは設定済みという前提で以下の(A)~(C)のように 宣言すればデータの読み書きは出来ると思うのですが、 (A)~(C)を配列や構造体として扱いたい場合、どのように宣言すれば 良いのでしょうか? (A) #define SRAM1 (*(volatile unsigned int*)(0x200000)) (B) #define SRAM2 (*(volatile unsigned int*)(0x200002)) (C) #define SRAM3 (*(volatile unsigned int*)(0x200004)) (D) SRAM1 = 1; (E) SRAM2 = 2; (F) SRAM2 = 3; よろしくお願いします。

  • C言語にて、XORの演算時間を取得するには?

    題名の通りです。 C言語で、XOR命令の演算時間を取得しようとしています。演算時間を取得する関数部分は下の通りで、a^=b, b^=aをひたすら繰り返すことで、命令の演算時間を取得する、というものです。この方法を使って、ADD命令については演算時間を取得できました。しかし、XORについては、計測時間がほぼゼロになり、XORが動いていないようです。 その理由は、同じ値をXORすると元に戻るというXORの原理のため、コンパイラの最適化によりfor文内のXOR命令が消えてしまったからだと考えられます。 かといって、t1とt2にvolativeを付けて宣言すれば、最適化によって消去はされませんが、volativeの性質上、メモリアクセスの時間を取得することになってしまいます。 どうすれば、XOR命令のみの演算時間を取得できるでしょうか。 アイディアや指摘がありましたら、どうかご教授下さい。 -------------------------------------------------------------- #define ADD(a, b) a+=b #define XOR(a, b) a^=b /* 10回反復するマクロ */ #define repeat10(S) S S S S S S S S S S /* 各命令の演算時間を計測する関数 */ void operation_test( unsigned int *out, unsigned int p1, unsigned int p2, int its) { /* volatileを付けた宣言だと、t1とt2はメモリに取られるため、目的を達成できない */ unsigned int t1 = p1; unsigned int t2 = p2; /* itsは反復回数 */ for(int i=0; i<its; i++){ /* いずれかの行を選択する。ADDはきちんと演算されているよ */ /* うだが、XORは最適化により消去されてしまっているらしい */ repeat10(ADD(t1, t2); ADD(t2, t1); ) //repeat10(XOR(t1, t2); XOR(t2, t1); ) } out[0]=t1+t2; } --------------------------------------------------------------

このQ&Aのポイント
  • WRC-1467GHBK-Sを使用したNTTフレッツ光回線のWi-Fiの繋がりが遅い原因を解説します。動画の視聴が途切れ、ダウンロード速度が遅い理由には時間帯やルーターの位置、使用期間などが考えられます。
  • ネットワークの混雑やルーターの位置、電子レンジの影響、使用期間などがWi-Fiの繋がり速度の遅さに影響を与えます。本記事ではこれらの要素について詳しく解説し、問題の解決策を提案します。
  • WRC-1467GHBK-Sを使用したNTTフレッツ光回線のWi-Fiの繋がり速度が遅い原因について解説します。時間帯の影響やルーターの位置、電子レンジの近くで使用すること、使用期間の長さなどが問題となる可能性があります。問題の解決策も紹介します。
回答を見る

専門家に質問してみよう