牛骨文教育服务平台(让学习变的简单)
博文笔记

不使用sizeof求类型长度

创建时间:2015-05-16 投稿人: 浏览次数:429

    一开始,我是想用相邻的地址相减,答案应该就出来了;

#include<iostream>
using namespace std;

void main()
{
	
	 int x[2] = {0};
	 int *p1 = &x[0];
	 int *p2 = &x[1];
	cout << p2 - p1;
}

    然后案等于1;
找了下资料,发现原来,C语言的标准中规定了 加法与减法运算对于地址的操作和对于值的操作是不同的。

当一个加法运算,加号左边的操作数是一个指针,而右边的操作数是一个整数时,这个整数值先乘以指针类型的大小(sizeof(int)),然后再加到左边的数上。当同一个数组的两个成员的指针相减时,其差值为:地址值的差,再除以一个数组成员的sizeof(int)。这个结果代表了两个指针对应元素的下标之差。

    所以,把地址强制类型转换成int 或者char型,然后再相减就可以得出我们想要的size了。

#include<iostream>
using namespace std;

void main()
{
	
	 int x[2] = {0};
	 char *p1 = (char *) &x[0];
	 char *p2 = (char *) &x[1];
	 cout << p2 - p1;
}


  其他的方法还有利用数据的存储的,比如当系统在存-1这个数的时候,是存成0xffff或者0xffffffff有几个f会由类型长度决定;

#include<iostream>
using namespace std;

void main()
{
	
	int x;
	x = -1;
	switch (x) 
	{      
	case 0xffff:        cout<<"2" ; break;
	case 0xffffffff:    cout<<"4" ;break;
	}
}
  或者通过对数值1不停的乘2,最后到临界(over之后会等于0)比较大小,确定是多少也可以,方法应该还蛮多的,理解这部分,对数据存储还蛮有用。

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。