C ++負の値は、符号なしのタイプに割り当てられました

以下の符号付き1は、下位バイト、高バイト補数符号ビットを配置する、符号付きマルチバイトに割り当てられたバイト。
2、下位バイト、0の上位バイト置き、整数変数に割り当てられたunsigned char型;
3、シンボルキャラクタが低いバイトを配置する、整数変数に割り当てられた、高バイトの補数符号ビット。
図4は、変換は、バイナリベースは、その後、符号ビットは、元の種類に応じて決定されることを理解すべきです。範囲エラーが発生しますを超えて一般的な問題は、範囲内に発生しません。

まず、

#include <iostream>

int main(){
	// 将右边的数字转换为二进制再赋予
	unsigned char a1 = -1;  
	signed char a2 = -1;
	// 类型自动转换
	std::cout<<(int)a1<<" "<<(int)a2<<std::endl;
	if(a1 == a2){
		std::cout<<"ok";
	}
	return 1;
} 

それは-1 11111111補数形式に変換され、その後、署名された整数型の変換時間は、unsigned char型のために、高いビット0、符号ビットの上位ビットチャーに署名しました。signed int型の印刷に合わせて印刷する場合
、出力:

255 -1

--------------------------------

II。

#include <iostream>

int main(){
	unsigned char a1 = 128;
	// 数值溢出
	signed char a2 = 128;
	std::cout<<(int)a1<<" "<<(int)a2<<std::endl;
	if(a1 == a2){
		std::cout<<"ok";
	}
	return 1;
} 

unsigned char型、問題ない範囲内で128。しかし、この時に署名された整数を割り当てる128 signed char型、バイナリ10000000、上部拡張符号ビットを越えて、-128となります。
出力:

128 -128

--------------------------------

III。

#include <iostream>

int main(){
	unsigned char a1 = 256;
	signed char a2 = 256;
	std::cout<<(int)a1<<" "<<(int)a2<<std::endl; 
	if(a1 == a2){
		std::cout<<"ok";
	}
	return 1;
} 

出力:

0 0
ok
--------------------------------
公開された557元の記事 ウォンの賞賛500 ビュー153万+

おすすめ

転載: blog.csdn.net/qq_16234613/article/details/104006058