Skip to content

什么不用二进制表示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;
}

学 习 记 录