筑基_C_2_各种数据类型的位模式

本文探讨了C语言中各种数据类型的位模式,包括泛型函数show_bytes()的实现,原子类型如无符号数、补码数和浮点数(遵循IEEE754标准)的位表示,以及复合类型如数组、字符串、枚举、结构体和共用体的特性。文章还强调了指针长度与数据总线宽度的关系,并提到了浮点数的特殊值和非格式化值的表示。
摘要由CSDN通过智能技术生成

C语言各数据类型的长度

signed unsigned MCS-51 x86-32 x86-64 linux64
char unsgiend char 1 byte 1 byte 1 bytes 1 bytes
short unsgiend short 2 byte 2 byte 2 bytes 2 bytes
int unsgiend int 2 byte 4 byte 4 bytes 4 bytes
long unsgiend long 4 byte 4 byte 4 bytes 8 bytes
float - 4 byte 4 byte 4 bytes 4 bytes
double - 4 byte 8 byte 8 bytes 8 bytes
void * - 2 byte 4 byte 8 bytes 8 bytes
bit - 1 bit - - -
sfr - 1 byte - - -
sfr16 - 2 byte - - -
sbit - 1 bit - - -

2.1 泛型函数 show_bytes()

数据的位模式:是指数据在计算机内存中的0/1表示模式

简洁版本:

不要整那么多没用的东西去为难自己!你只需要实现数据的位模式展现即可!在这里不要去考虑那些“容器”类型数据的每个成员的打印!也不要去考虑大小端模式!这些功能可以编写其它的函数去实现!结构化程序设计中,每个函数实现你最感兴趣的那个功能即可。

void ShowBytes( void *start, uint8_t len)
{
   
    uint8_t i;
    for ( i = 0; i < len; i++ ) {
   
        printf ( "|%.2x", ((uint8_t *)start)[i] ); // can't be "char *", [-128, 127], 
        if ( i % 8 == 7 ) {
    // 8 in a row
            printf ( "|\r\n" ); // end of a row
        };
    }
    if ( len % 8 != 0 ) {
   
        printf ( "|\r\n" );
    }
}

“乱七八糟” 版本

void show_bytes(void *start, uint8_t len, BOOL isAtomics)
{
   
    uint8_t i;
    for(i = 0; i < len; i++) {
   
        if(isAtomics && (Little_Endian == check_memory_mode()) ) {
   
            printf("|%.2x", ((uint8_t *)start)[len - i - 1]);
        } else {
   
            printf("|%.2x", ((uint8_t *)start)[i]);
        }
    };
    printf("|\r\n");
}

2.2 原子(Atomics)类型

2.2.1 无符号数

  • 8位无符号数 unsigned char
0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1
2 7 2^7 27 2 6 2^6 26 2 5 2^5 25 2 4 2^4 24 2 3 2^3 23 2 2 2^2 22 2 1 2^1 21 2 0 2^0 20
  • 16位无符号数 unsigned short
0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1
2 15 2^{15} 215 2 14 2^{14} 214 2 13 2^{13} 213 2 12 2^{12} 212 2 11 2^{11} 211 2 10 2^{10} 210 2 9 2^9 29 2 8 2^8 28
0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1
2 7 2^7 27 2 6 2^6 26 2 5 2^5 25 2 4 2^4 24 2 3 2^3 23 2 2 2^2 22 2 1 2^1 21 2 0 2^0 20
  • 32位无符号数 unsigned int / unsigned long (x86-64)
    注意:在linux64中,unsigned long 占用 64 bits
    注意:在 MCS-51 & Keil 中,unsigned int 占用 16 bits
0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1
2 31 2^{31} 231 2 30 2^{30} 230 2 29 2^{29} 229 2 28 2^{28} 228 2 27 2^{27} 227 2 26 2^{26} 226 2 25 2^{25} 225 2 24 2^{24} 224
0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1
2 23 2^{23} 223 2 22 2^{22} 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>