从string.size()和string.length()聊到长度的问题和一个关于数据结构定义的技巧

最近工作中要查看一下string的长度,然后忘了是哪个函数,所以去网上搜了一搜,决定把网上学的和其他的一些有关长度的东西在这里汇总一下, 然后就有了此帖.

 

string 是从c语言的char数组的概念发展出来的.但是char指针变量仍然和string的变量不是一个东西,虽然他们都可能是跟字符串打交道. 看下面的例子:

char a[4] = "ab";

char c[] = "ab";

string b = "ab"; ----->  b[0] = 'a';  b[1] = 'b'; b[b.size()-1] = 'b'

在string中b.length()和 b.size()没什么区别,就是指去掉'\0'后的字符串的长度  b.length()=2   b.size()=2

现在我们再来看看sizeof(a) 和 strlen(a)的区别  sizeof(a) = 4   sizeof(c) = 3   strlen(a)=2 strlen(c) = 2.

sizeof求的是真正的内存分配的长度, strlen求的是字符串的长度(注意字符串长度不包括'\0')

 

int* a;   32位机器上面 sizeof(a) = 4   在64位机器上sizeof(a) = 8   [因为指针就是一个地址,这个地址必须能覆盖机器的所有选址空间 所有32位机器= 4 * 8   而64位机器= 8 * 8   所以指针大小会有变化]  

指针长度好确定,但是int,short,long,char等长度的确定就比较麻烦了下面一段的学习来源 http://blog.sina.com.cn/s/blog_865e6dd50102vmqr.html

 

 

int值,short值,char值等的长度规则

1. c/c++规定int字长和机器字长相同

2. 操作系统字长和机器字长未必相同 (机器字长即cpu的字长,指的是其一条指令/一次运算 可以处理的最大宽度)

3.编译器根据操作系统字长来定义int字长

 

所以在无os的嵌入式计算机系统上 int的长度和处理器字长一致; 有操作系统的时候,编译器会根据操作系统的字长来定义int字长: 假如windows64上面运行Dos16,那么所以for dos16的c/c++编译器中int都是16位的,  

简单的说是编译器觉得了int的长度是多少

 

对于整型的数值范围,每一个编译器里面都有一个标准头文件:limits.h,这个头文件中定义了一些该编译器所使用的所有数据类型的范围的宏.例如

#include<limits.h>

int的最大值 INT_MAX  最小值  INT_MIN   unsigned int 的最大值 UINT_MAX

 

在数据结构的设计中,优秀的程序员并不会定义下面的数据结构(假设为win32平台)

typedef struct tagTypeExample

{

unsigned short x;

unsigned int y;

} TypeExample;

 

 他们会像下面那样定义:

#define UINT16 unsigned short   //16位无符号整数

#define UINT32 unsigned int  //32位无符号整数

typedef struct tagTypeExample

{

UINT16 x;

UINT32 y;

}TypeExample;

因为这样定义的数据结构非常具有通用性,如果上述32平台上的数据要发送给16位平台,在16位平台上仅仅需要修改UINT16, UINT32的定义,就可以接收并存储32位平台的数据了.

#define unsigned int UINT16 //16位无符号整数     ---->对应32位平台的short

#define unsigned long UINT32 //32位无符号整数   ----->对应32位平台的int

 

几乎所有的优秀软件设计文档都是这么定义数据结构的.!!!!!

 

posted @ 2016-04-16 16:27  哈哈不是嘎嘎  阅读(12046)  评论(0编辑  收藏  举报