最近工作中要查看一下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

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

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

  1. String构造器中originalValue.length>size 发生的情况

    最近在看Jdk6中String的源码的时候发现String的有个这样的构造方法,源代码内容如下: public String(String original) { int size = origina ...

  2. Java for循环每次都通过list.size()和 string.length()获取大小是否消耗性能?

    前言 有人说在for循环之前用一个局部变量先获取到list.size().str.length(),然后在for循环的判断条件里通过这个局部变量替换list.size().str.length()会节 ...

  3. The length of the string value exceeds the length configured in the mapping/parameter.

    在NHibernate 3.3 中存储的字符串太长,会抛异常:The length of the string value exceeds the length configured in the m ...

  4. String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)

    本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...

  5. [转] 请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧

    这帖是用来回复高级语言虚拟机圈子里的一个问题,一道Java笔试题的. 本来因为见得太多已经吐槽无力,但这次实在忍不住了就又爆发了一把.写得太长干脆单独开了一帖. 顺带广告:对JVM感兴趣的同学们同志们 ...

  6. Java JVM 请别拿“String s=new String("z");创建了多少实例”来面试 [ 转载 ]

    Java 请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧 [ 转载 ] @author RednaxelaFX 原文链 ...

  7. C#"曾经的字符串数组"string[] array=new string[]{"**","****"};

    写博客是一件很伟大的事情,尤其是也牛逼的博客,因为它能帮助需要的人,更能使自己对知识有一个更为深刻的理解! 欢迎关注我的博客! 字符串操作(取当前时间) string time=convert.tos ...

  8. String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别

    本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...

  9. 请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧---转

    http://www.iteye.com/topic/774673 羞愧呀,不知道多少人干过,我也干过,面壁去! 这帖是用来回复高级语言虚拟机圈子里的一个问题,一道Java笔试题的. 本来因为见得太多 ...

随机推荐

  1. Razor 语法快速参考

    Razor 语法快速参考   本文引自:http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx 语法名称 Raz ...

  2. Look and say numbers

    地址:http://www.codewars.com/kata/53ea07c9247bc3fcaa00084d/train/python There exists a sequence of num ...

  3. Can't connect to MySQL server on localhost (10061)解决方法

    出现这种错误的原因是由于MySQL的服务被关闭的原因,重新启动一下服务就可以了,启动服务的操作如下: 右键[计算机]-[管理]

  4. jQuery练习实例(四)

    最近写的jquery实例--jQuery图片九宫格样式鼠标悬停图片滑动切换效果 有兴趣的同学可以参考一下,这幅效果,个人觉得挺不错的 <%@ page language="java&q ...

  5. 假设但是学习java入门,请离开SSH稍远

    我觉得有点累了步行上班,我想买一辆自行车.结果去了一看,想2500片.旁边的人说,2500所有最好加一些钱,买一挖电. 遂问电动车价格,3500,决定买.却被告知不如加点钱买小踏板摩托划算.于是看摩托 ...

  6. 保持Service不被Kill掉的方法--双Service守护 && Android实现双进程守护

    本文分为两个部分,第一部分为双Service守护,第二部分为双进程守护 第一部分: 一.Service简介:Java.lang.Object ↳Android.content.Context  ↳an ...

  7. JQuery和UpdatePannel的问题

    转: http://www.cnblogs.com/Tim_Liu/archive/2010/11/25/1887937.html 最近在做一个项目,因为涉及到的字段数量很多所以想偷把懒,便使用了Up ...

  8. xshell十大技巧

    xshell是我用过的最好用的ssh客户端工具,没有之一.这个软件完全免费,简单易用,可以满足通过ssh管理linux vps所有需要,唯一遗憾的是没有官方中文版. 警告:不要下载所谓的汉化版,可能有 ...

  9. is_numeric漏洞分析

    2014年,PHP中is_numeric函数十六进制绕过漏洞引发了一次安全问题 接下来,我们来分析一下这个漏洞的原理 函数介绍: is_numeric — 检测变量是否为数字或数字字符串. 函数原型: ...

  10. 本地nginx多域名映射

    前言: 工作两年多了,一直感觉技术上没有太大的长进,好多东西感觉会但是给别人讲起来的时候又感觉和没学过一样.以后希望能坚持写博客,把看过的东西都一点一滴积累下来.言归正传,今天要说的是nginx与ho ...