您的位置:首页 > 产品设计 > UI/UE

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

2013-12-04 11:30 447 查看
来自: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

/* 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 变量时, 会将字符串的第一个字符赋值给变量.

例如如下代码:

[cpp]
view plaincopy

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐