符号なし0(0-1=-1?)

4734 ワード

符号なし演算は何に注意すればいいですか?
一:符号なし数とは何ですか.
符号なし数(unsigned number)とは、符号付き数に対して、機械ワード長全体の全バイナリビットが数値ビットを表し、数の絶対値に相当する.
有符号数(signed number)と無符号数はほぼ同じであり,異なるのは,一般に最高有効ビット(MSB)で数を表す記号,正数は0,負数は1で表される.
二:なぜシンボル数が存在しないのですか.
1 . 符号なし数という概念はプログラミング言語特有のデータ型であり、私たちは現実生活で出会った様々な色のデータのマッピングであり、場合によっては出現する数字がゼロより小さくなることはできないため、符号なし数が誕生し、現実データからコンピュータデータへの抽象をよく実現し、コンピュータが入力データを処理する手段を提供した.
2 . 無記号数は記号数のある概念に基づいている.データサイズを表す範囲は符号数の2倍で、より強力な表示張力があります.
3:符号なしの数はどのように使用しますか?
1 . 表示方法:unsigned int i=666;2 . 範囲を表す:int(16 bitの場合)タイプの変数の場合、iの範囲は0——>65535である.
3 . データ間の連絡先:
符号なしデータ-符号なしデータ:通常の演算で、結果は符号なしデータです.
符号なしデータ:符号なしデータ:タイプが上昇します.符号なしレベルが符号付きレベルより大きいため、符号なしタイプが符号なしに上昇し、奇抜な結果になる可能性がありますが、これはどのように説明するかによって異なります.どういう意味ですか.
符号付き+符号なし
#include 

int main(void)
{
    unsigned int ui = 6;
    int i = -12 ;

    //             ,               ,           ,              ,     ,  :
    printf("%u
"
,( ui+i ) ); // : 4294967290 printf("%d
"
,( ui+i ) ); // : -6 if ( (ui+i) > 0 ) // 0 , (unsigned int )0 , (ui + i ) > 0 。 printf(" (ui+i) > 0 is True
"
); if ((ui + i) > (unsigned int)0) // 。 printf("(ui+i) > (unsigned short int)0 is True
"
); return 0; }

結果:4294967290-6(ui+i)>0 is True(ui+i)>(unsigned short int)0 is True
四:符号なし0-1は何ですか.
C++実装
#include 
using namespace std;
int main(void)
{
    unsigned short int i =0;
    int j = 8,p;

    p = j<<1;
    i =i-1;

    cout <<"i = " << i;            
    cout <<"
p = "
<< p; return 0; }

結果:i=65535 p=16
どうして?
1 . 16ビットの範囲は、(符号なし)0——>65535(65536数字2^16=65536);
2 . sizeof(short) =2 (16 bits) , unsigned short int a = 0 ;
3 . 0000_0000_0000_0000マイナス1は(1111_1111_1111_1111_1111)となる(符号数なしで65535と示す).
以下にまとめます.
1 . 要するに、いずれにしても、無記号と有記号を一緒に演算すると、有記号がタイプアップし、正常な演算が演算されます.
2 . 実は、結果が何なのかは、結果をどのように解析するかによって、記号があるのか、記号がないのかがポイントです.
3 . たとえば、int a = -1 ; printf("%u
",a);
の結果は-1ではありません.

int main(void)
{
    short int a = -1;

    printf("%u
"
,a); // %u printf("%i
"
,a); // %d %i return 0; }

結果:
4294967290
-1