从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
几乎所有的优秀软件设计文档都是这么定义数据结构的.!!!!!
从string.size()和string.length()聊到长度的问题和一个关于数据结构定义的技巧的更多相关文章
- String构造器中originalValue.length>size 发生的情况
最近在看Jdk6中String的源码的时候发现String的有个这样的构造方法,源代码内容如下: public String(String original) { int size = origina ...
- Java for循环每次都通过list.size()和 string.length()获取大小是否消耗性能?
前言 有人说在for循环之前用一个局部变量先获取到list.size().str.length(),然后在for循环的判断条件里通过这个局部变量替换list.size().str.length()会节 ...
- 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 ...
- String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)
本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...
- [转] 请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧
这帖是用来回复高级语言虚拟机圈子里的一个问题,一道Java笔试题的. 本来因为见得太多已经吐槽无力,但这次实在忍不住了就又爆发了一把.写得太长干脆单独开了一帖. 顺带广告:对JVM感兴趣的同学们同志们 ...
- Java JVM 请别拿“String s=new String("z");创建了多少实例”来面试 [ 转载 ]
Java 请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧 [ 转载 ] @author RednaxelaFX 原文链 ...
- C#"曾经的字符串数组"string[] array=new string[]{"**","****"};
写博客是一件很伟大的事情,尤其是也牛逼的博客,因为它能帮助需要的人,更能使自己对知识有一个更为深刻的理解! 欢迎关注我的博客! 字符串操作(取当前时间) string time=convert.tos ...
- String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别
本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...
- 请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧---转
http://www.iteye.com/topic/774673 羞愧呀,不知道多少人干过,我也干过,面壁去! 这帖是用来回复高级语言虚拟机圈子里的一个问题,一道Java笔试题的. 本来因为见得太多 ...
随机推荐
- PAT 1004. Counting Leaves (30)
A family hierarchy is usually presented by a pedigree tree. Your job is to count those family membe ...
- Jsp的内置标签和jstl标签
1.内置标签(动作标签) 内置标签不需要再jsp页面导入标签 1).forward:请求的转发,格式如下 <%-- 作用与这个相同 <%request.getRequestDispatch ...
- 包的定义和导入-----package
1.包的定义 其中: . 表示当前路径 2.包的导入 一个类需要被外包访问的话,需要定义为public class. package org.lxh.demo08.a ; public class ...
- linux下64位汇编的系统调用系列
http://blog.csdn.net/mydo/article/category/3084893
- WPF自定义窗体仿新毒霸关闭特效(只能在自定义窗体中正常使用)
比较简单的一个小功能,和新毒霸类似的效果. 效果代码: bool closeStoryBoardCompleted = false; DoubleAnimation closeAnimation1; ...
- Vmare12(虚拟机)安装Mac OS X Yosemite 10.10
需要预备的软件如下: OSX10.10的系统镜像,下载好之后将后缀.cdr改成.iso,下载来源如下: 链接:http://pan.baidu.com/s/1sj4ri5R 密码:y86w un ...
- 用标准版的Eclipse搭建PHP环境
用标准版的Eclipse搭建PHP环境 ——@梁WP 摘要:用标准版的Eclipse搭建PHP环境. 一.下载Eclipse的PHP插件 百度搜索phpeclipse,看到某条结果是带有SourceF ...
- Asp.net简单三层+Sqllite 增删改查
新建项目à新建一个空白解决方案 在Model新建一个实体类 using System; using System.Collections.Generic; using System.Linq; usi ...
- 原生js日期时间插件鼠标点击文本框弹出日期时间表格选择日期时间
原文出处 (这是我从互联网上搜来的,感觉能满足各方面的需求.个人感觉挺不错的,所以后期修改了一下向大家推荐!) 效果图: html代码: <!DOCTYPE html PUBLIC " ...
- 自己做的demo---宣告可以在java世界开始自由了
package $interface; public interface ILeaveHome { public abstract int a(); public abstract int b(); ...