C++中定义了几个short类型变量在内存中怎么不是两个字节的

为什么我在C++中定义的几个short类型的变量在内存中不是两个字节的,而是四个字节存储的?(声明:我的平台中short类型的确是占用2个字节的)例如:#include <iostream>using namespace std;int main(){ short a,b,c,d; cout<<&a<<endl<<&b<<endl<<&c<<endl<<&d<<endl; return 0;}
运行结果为:

而且我用sizeof函数获取short的字节个数,结果显示为2的,例如:
#include <iostream>using namespace std;int main(){ int i=sizeof(short); cout<<i<<endl; return 0;}
说明我的平台(即编辑器或者环境等)中short类型的确是占用2个字节的。问题是为什么内存中显示用了四个字节存储的?求各位大神帮忙啊。

C++中的变量是在其长度比int的长度短时是以int的长度为基准“ 对齐”的。所以别说是short,就是char,你声明4个后相邻也要差4个字节,不信你试试……追问

改为char类型,它显示出的结果是:

 

那如果真的像你说的那样,在其长度比int的长度短时是以int的长度为基准“ 对齐”的,那么中间空的单元岂不是浪费了,这样还怎么节省内存空间?知道你是大神,求指教,谢谢!

追答

说得对,就是浪费了。可是这样做,且规定从偶数地址开始,会带来访问时效高的好处——原理就不多说了……
你的那个输出结果恐怕有语句上的错误。C++把cout << "地址“定义为输出以"地址“开头的字符串了,你在每个&前加一个(char *)强制一直看看。其他不变,应该就不会是你贴上来的输出情况了……大神不敢当!

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-07-21
cout<<&a<<endl<<&b<<endl<<&c<<endl<<&d<<endl;
改为再试试
cout<<a<<endl<<b<<endl<<c<<endl<<d<<endl;

&a, 是地址 sizeof(&a)=4本回答被提问者采纳

C++中的short类型变量在内存中不是两个字节的吗?
第一 你的变量都是int类型的 并不是short类型的, 它们在16位机器中是相等的, 但是如果是32位的机器不等的。所以你的每个地址相差4;第二 你最好不要用这种方法测试, 因为你这样连续的定义变量,并不能保证这些变量在内存中也会 依次排列,这种行为是未定义的, 取决于编译器。第三 楼上的说...

shortshort数据类型(C\/C++)
C语言提供了一种整型数据类型,称为short,用于创建整数值的变量。例如,声明一个名为i的短整型变量可以写为:short i;关于short类型的长度,其实际大小取决于编译器的设置。根据标准规定,short类型的最小字节数应为16位,即占用两个字节。在limits.h头文件中,定义了short类型的上下限范围:SHRT_MIN...

c++ short占几位?
1、占用字节根据机型不同会有不同:在一般的电脑中,int占用4字节,32比特,在之前的微型机中,int占用2字节,16比特。在32位平台下如windows(32位)中short一般为16位。2、数值范围不同:int在一般的电脑中,数据范围为-2147483648~2147483647[-2^31~2^31-1],在之前的微型机中,int数据范围为-3...

C++里的内置类型 int 到底是32位的还是16位的?
C++标准只规定int至少是16位,而且不比short int短,对具体是多少位没做要求,取决于编译器怎么实现。事实上,C++对所有算术类型的具体长度都没做要求。不过在目前大多数机器上,大多数编译器都将int实现为32位。

C++中有符号长整形和无符号长整形能表示的数据范围?
short、int 和 long 类型都表示整型值,存储空间的大小不同。一般, short 类型为半个机器字长,int 类型为一个机器字长,而 long 类型为一个或两个机器字长(在 32 位机器中 int 类型和 long 类型通常字长是相同的)。unsigned int 0~4294967295 就是2^32-1int 2147483648~2147483647...

C++中的变量类型都有哪些,各占多少字节?
第一种 字符型(char) 占1BYTE 第二种 整型(int) short int 占 2BYTE int 占4BYTE 第三种 浮点型 float 占4BYTE double 占8BYTE long double 占16BYTE

C语言:我发现我机器的整型一个是占四个字节的,如果想设置成二个字节如何...
你的编译器可能是C++的那种 你可以这样:typedef short int16 这样你用int16来定义变量,就是两个字节的了 因为在C++里,short是16位,而int是32位

c++中一个四字节的int型怎么转换为两个字节的呢 功能就像c#的Convert.To...
假设4字节整型变量名为i 转成2字节有符号整型(short):(short)i 转成2字节无符号整型(unsignen short):(unsigned short)i 为了简化起见,以上皆使用c写法 Convert::ToBoolean应该无需实现,在c\/c++中,所有整型在需要逻辑值的表达式中,同时具备逻辑值,若整型值为0,则对应逻辑值为false,否则...

我在visual c++里定义一个短整型的i和j的变量,short是两个字节,那么物...
除此之外,C++标准没有规定相邻局部变量的内存必须相邻,所以内存位置还是由实现决定的。如果代码中没有对局部变量区地址(&),编译器可以将该变量存储在寄存器中已优化其存储速度(64位CPU包含更多的通用寄存器)。这种优化,代码中两个相邻的局部变量存储位置就不能说“差几个字节了”。

short和int的区别是什么?
2、short:短整型变量不得低于16位,即两个字节。二、范围不同 1、int:数据范围为-2147483648~2147483647[-2^31~2^31-1]。2、short:数据范围为范围-32768~+32767。三、特点不同 1、int:除了int类型之外,还有short、long、long long类型可以表示整数。2、short:依据程序编译器的不同short定义的...

相似回答