2017-10-27 7 views
1

次のコードでは、関数の引数としてsize_tを使用し、負の値を渡しました。以下のコマンドを使ってGCC(Linux)上でプログラムをコンパイルしました。コンパイラがsize_tで負の値の警告を生成しないのはなぜですか?

g++ -Wall size.cpp -o size 

GCCは警告なし成功したコンパイルが、結果は私が期待されていないものを:

size_t : 18446744073709551615 
int : -1 

コード:コンパイラがsize_tと負の値についての警告を生成しないのはなぜ

#include <iostream> 

void func1(size_t i) 
{ 
    std::cout << "size_t : " << i << std::endl; 
} 

void func2(int i) 
{ 
    std::cout << "int : " << i << std::endl; 
} 

int main() 
{ 
    func1(-1); 
    func2(-1); 
    return 0; 
} 

size_t

ので
+1

'size_t'は符号なしタイプです。 – tkausl

+0

負の整数をエンコードする(そして最も一般的な)方法である[* 2の補数*](https://en.wikipedia.org/wiki/Two's_complement)について少し学ぶことをお勧めします。 –

+0

@ Some programmer dudeコンパイラがsize_tで負の値の警告を生成しないのはなぜですか? – rsp

答えて

2

はC++で常に符号なしである:

タイプsize_tは、任意のオブジェクトのサイズをバイト単位で含むのに十分な大きさである実装定義の符号なし整数型です。


なぜsize_t型で負の値のための警告を生成し、コンパイラはありませんか?

size_tを割り当てることは、負の値は、明確に定義されている符号付きと符号なしの変換、呼び出すため:

を宛先タイプが符号なしの場合、得られた値が一致以上の符号なし整数でありますソース整数(モジュロ2 n、nは符号なしタイプを表すために使用されるビット数) [注: 2の補数表現では、この変換は概念的であり、ビットパターンに変更はありません(切り捨てがない場合)。 - 終了ノート]

関連する問題