以下の符号付き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
--------------------------------