在编程的时候,发现了一些不知道什么类型的数据类型,于是整理了一下。
1.socklen_t是一种数据类型,它其实和int差不多,在32位机下,size_t和int的长度相同,都是32 bits,但在64位机下,size_t(32bits)和int(64 bits)的长度是不一样的,socket编程中的accept函数的第三个参数的长度必须和int的长度相同。于是便有了socklen_t类型。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
查看socklen_t定义的头文件。
cd /usr/include && grep -r socklen_t * | grep typedef
2. uint8_t\uint_16_t\uint32_t\uint64_t
_t表明这些数据类型都是根据内置类型typedef出来的,并不是新的数据类型,是我们已知类型的别名。
在C99中定义了这些数据类型。具体在:/usr/include/stdint.h ISO C99: 7.18 Integer types
#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
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
格式化输出:
uint16_t %hu
uint32_t %u
uint64_t %lu //无符号长整型(unsigned long int)
uint64_t %llu (unsigned long long int)
3.size_t/ssize_t
size_t :
//无符号整型(unsigned int (32位机下),在64位机下size_t为unsigned long int),size_t一般用来计数,
//它和socklen_t一样是为了增强程序的可移植性,在不同的平台上保持和unsigned int的字节数相同
ssize_t :
//有符号整型(signed int(32位机下),在64位机下ssize_t为signed long int),ssize_t其实是
//有符号的size_t,这个数据类型用来表示可以被执行读写操作的数据块的大小
4. pthread_t :一般用于声明线程ID
pthread_t:unsigned long int ,一般情况下是4个字节,不同的环境下,由unsigned long int的大小决定。
测试程序:
#include<stdio.h>
int main()
{
unsigned long int m = 1;
unsigned int n = 1;
unsigned long long int l = 1;
printf("long int %u bytes\n",sizeof(m));
printf(" int %u bytes\n",sizeof(n));
printf("long long int %u bytes\n",sizeof(l));
return 0;
}
在版本信息为Linux localhost.localdomain 2.6.32-431.el6.i686下:
在visual studio 2008下:
参考文章:
http://blog.csdn.net/gowyz/article/details/6606313