uint8_t、uint16_t、uint32_t、uint64_t

uint8_t、uint16_t、uint32_t、uint64_t 这些数据类型是 C99 中定义的,具体定义在:/usr/include/stdint.h

ISO C99: 7.18 Integer types <stdint.h>

/* There is some amount of overlap with <sys/types.h> as known by inet code */
#ifndef __int8_t_defined
# define __int8_t_defined
typedef signed char             int8_t; 
typedef short int               int16_t;
typedef int                     int32_t;
# if __WORDSIZE == 64
typedef long int                int64_t;
# else
__extension__
typedef long long int           int64_t;
# endif
#endif
 
/* Unsigned.  */
typedef unsigned char           uint8_t;
typedef unsigned short int      uint16_t;
#ifndef __uint32_t_defined
typedef unsigned int            uint32_t;
# define __uint32_t_defined
#endif
#if __WORDSIZE == 64
typedef unsigned long int       uint64_t;
#else
__extension__
typedef unsigned long long int  uint64_t;
#endif

格式化输出:

  • unit64_t:%llu

  • unit32_t:%u

  • unit16_t:%hu

注意:必须小心 uint8_t 类型变量的输出

uint8_t fieldID = 67;
cerr<< "field=" << fieldID <<endl;

结果发现是:field=C 而 不是 field=67

这是由于 typedef unsigned char uint8_t;

uint8_t 实际是一个 char,cerr << 会输出 ASCII 码是 67 的字符,而不是 67 这个数字。因此,输出 uint8_t 类型的变量实际输出的是其对应的字符, 而不是真实数字,若要输出 67,则可以这样:

cerr<< "field=" << (uint16_t) fieldID <<endl;

结果是:field=67

同样,uint8_t 类型变量转化为字符串以及字符串转化为 uint8_t 类型变量都要注意

  • uint8_t类型变量转化为字符串时得到的会是ASCII码对应的字符
  • 字符串转化为 uint8_t 变量时, 会将字符串的第一个字符赋值给变量
#include <iostream>
#include <stdint.h>
#include <sstream>
using namespace std;
 
 
int main()
{
    uint8_t fieldID = 67;
 
    // uint8_t --> string
    string s;
    ostringstream strOStream;
    strOStream << fieldID;
    s = strOStream.str();
    cerr << s << endl;
    
    // string --> uint8_t
    s = "65"; 
    stringstream strStream;
    strStream << s;
    strStream >> fieldID;
    strStream.clear();
    cerr << fieldID << endl;
}
c
6
*