uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型

来源:互联网 发布:免编程2d游戏引擎 编辑:程序博客网 时间:2024/05/20 20:23

来自:http://blog.csdn.net/zklth/article/details/7978362


uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型

这些数据类型是 C99 中定义的,具体定义在:/usr/include/stdint.h    ISO C99: 7.18 Integer types <stdint.h>

[cpp] view plaincopy
  1. /* There is some amount of overlap with <sys/types.h> as known by inet code */  
  2. #ifndef __int8_t_defined  
  3. # define __int8_t_defined  
  4. typedef signed char             int8_t;   
  5. typedef short int               int16_t;  
  6. typedef int                     int32_t;  
  7. # if __WORDSIZE == 64  
  8. typedef long int                int64_t;  
  9. # else  
  10. __extension__  
  11. typedef long long int           int64_t;  
  12. # endif  
  13. #endif  
  14.   
  15. /* Unsigned.  */  
  16. typedef unsigned char           uint8_t;  
  17. typedef unsigned short int      uint16_t;  
  18. #ifndef __uint32_t_defined  
  19. typedef unsigned int            uint32_t;  
  20. # define __uint32_t_defined  
  21. #endif  
  22. #if __WORDSIZE == 64  
  23. typedef unsigned long int       uint64_t;  
  24. #else  
  25. __extension__  
  26. typedef unsigned long long int  uint64_t;  
  27. #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 变量时, 会将字符串的第一个字符赋值给变量.

例如如下代码:

[cpp] view plaincopy
  1. #include <iostream>  
  2. #include <stdint.h>  
  3. #include <sstream>  
  4. using namespace std;  
  5.   
  6.   
  7. int main()  
  8. {  
  9.     uint8_t fieldID = 67;  
  10.   
  11.     // uint8_t --> string  
  12.     string s;  
  13.     ostringstream strOStream;  
  14.     strOStream << fieldID;  
  15.     s = strOStream.str();  
  16.     cerr << s << endl;  
  17.       
  18.     // string --> uint8_t  
  19.     s = "65";   
  20.     stringstream strStream;  
  21.     strStream << s;  
  22.     strStream >> fieldID;  
  23.     strStream.clear();  
  24.     cerr << fieldID << endl;  
  25. }  

上述代码输出的是:

C

6

原创粉丝点击