什么不用二进制表示1字节?
我们都是知道C语言的所占空间最小的基本数据类型就是char(8bit),也就是1字节。 字节(Byte)是计算机存储的基本单位,1个字节由8个二进制位(bit)组成,每个二进制位可以表示0或1。所以一个字节可以有 2^8也就是256种表示方式。 也就是说,如果我用二进制来表示一个字节。那么00000000~11111111一共有256种表示1字节的方式。假如我把某个字节书面写出来就是:01011010。可以看到,太长了,不方便阅读和书写。
为什么要用十六进制表示1字节?
上面分析道,一个字节用二进制来表示需要写8个数(8个0或者1)。 而一个十六进制位就可以表示16个数。两个就可以表示256个数。恰好可以替代用二进制表示1字节的256种表示方式。 比如 1字节用十六进制可以表示成: 01 、a8、 56 这三个值都是由两个十六进制数组成,表示的值不同,但所占的空间都是一个字节。
c语言中的应用
TIP
接下来我将把占一字节的二进制数0b11111111转换十六进制数0xff 并且"0xff"字符串存到std::string里
c
std::string Hex(unsigned char ch);
int main(){
//注意char b = 0b11111111;从左往右数第一个二进制位表示正负号
unsigned char b = 125;
int temp = (int)b; //把这块1字节的内存当做存了一个10进制数来读 读到int里
std::string hex;
//从上面的分析,我们知道,一个字节最大就是0b11111111。存在int里面,那么这个int最大不超过255
//除以16,商就是两位十六进制数的第一位,余数就是第二位
hex.push_back(temp / 16 + '0');
hex.push_back(temp % 16 + '0');
std::cout<<"0x" + Hex(b)<<std::endl;
}
char tt(int num){
switch (num) {
case 10:
return 'a';
case 11:
return 'b';
case 12:
return 'c';
case 13:
return 'd';
case 14:
return 'e';
case 15:
return 'f';
}
return -1;
}
std::string Hex(unsigned char ch){
int temp = (int)ch;
std::string str;
int l = temp / 16;
if(l>=10){
str.push_back(tt(l));
}else{
str.push_back(l+'0');
}
int r = temp % 16;
if(r>=10){
str.push_back(tt(r));
}else{
str.push_back(r+'0');
}
return str;
}