9425


<https://github.com/neovim/neovim/issues/459>  
に以下のコメントがあります。

> We should replace most occurrences of char_u by uint8_t

char_uをuint8_tに変更する利点、char_uのままだとまずい点、とはどういうものでしょうか?

char_u自体はビット数(8など)がわからない、というのがまずいのでしょうか?

その他、移植の関係で変更をするのでしょうか?


CC BY-SA 3.0
2015-04-22T00:49:56.637
9423
2015-08-12T07:47:23.270
4840
question
c
char_uをuint8_tに変更する根拠


Issue本文によれば、独自定義型から[C99標準ライブラリの整数型`uintN_t`](http://en.cppreference.com/w/c/types/integer)に置き換えるのが目的のようです。標準規格準拠による移植性向上のためと考えられます。

> We should replace most occurrences of `char_u` by `uint8_t` [...] and use
> standard C99 fixed-size types such as `uint16_t`/`uint_64t` instead of
> `long_u`/`short_u`


CC BY-SA 3.0
2015-04-22T00:55:02.827
9424
2015-04-22T00:55:02.827
49
9423
answer


このプロジェクトでいえばchar_uは[src/types.h内に独自に定義](https://github.com/elmart/neovim/blob/007a19c4971e42d1bb7fdafc8fc7d6d8885120f2/src/types.h)したもので、プロジェクト自身が管理していく必要があります。対してint8_tはstdint.hで提供されるため移植性が高いです。


CC BY-SA 3.0
2015-04-22T00:56:03.527
9425
2015-04-22T00:56:03.527
4236
9423
answer


もうすでにベストアンサーも決まっているのでなぜuintX_t型を好んで使うかを説明します。  
リンクの定義では以下のようになっていました。

[code]

    typedef unsigned char char_u;
    typedef unsigned short short_u;
    typedef unsigned int int_u;
    
[/code]

[unsignedを使う理由は右シフトで０が代入されることを期待してでしょう](http://proger.blog10.fc2.com/blog-
entry-62.html)

charからのuint8_tへの変換の理由はchar型は最低でも８ビットであるためです。  
[これは１バイトが必ず８ビットである訳ではない事を示しています。](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%AF%E3%83%86%E3%83%83%E3%83%88_%28%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%29)  
そのため、処理系によりchar型が16ビットや32ビットでも良いことになります。

そこでもし、プログラムの設計者が８ビットを想定してプログラムを書いていたとしたら以下のような問題が発生します。例：１６ビットのchar型が割り当てられた。

[code]

    1000 0001 b
    0000 0000 1000 0001 b
    
[/code]

左へ1ビットシフト

[code]

    0000 0010 b
    0000 0001 0000 0010 b
    
[/code]

上では２となり下では258となり演算の結果がことなります。これはプログラムの設計者が意図した結果ではありません。  
そのため、型の定義でビット数が固定されているものが必要になります。それがuintX_t型です。  
この、uintX_t型はOSや通信のプログラムの中でよく利用されています。


CC BY-SA 3.0
2015-08-12T07:47:23.270
14315
2015-08-12T07:47:23.270
10455
9423
answer