2011-05-08 75 views
0

正如标题所暗示的,我不明白为什么它会是这样。为什么不能将C常量存储为短类型

验证码:

#include <stdio.h> 
#define try 32 


int main(void) 
{ 

    printf("%ld\n" , sizeof try); 

    return 0; 

} 

问题:

1)当我尝试使用sizeof接线员给存储不断try的大小存储在,我得到4这是32位。

2),因为它是大到足以容纳它为什么不是C储存于16位short

3)是否有使常量存储在short类型的任何方式?

谢谢你阅读我的问题,非常感谢。

+0

数值积分常数SANS后缀是INT:HTTP:// MSDN .microsoft.com/EN-US /库/ 00a1awxf%28V = VS.80%29。aspx – Anycorn 2011-05-08 18:31:12

回答

2

声明的常量可能是你在找什么:

const short try = 32; 

这通常是首选,因为我相信没有优化(或者甚至用)编译器不会尝试,以适应任何数据类型转换的最小数量的可寻址字节。

3

您误解了C预处理器。 C预处理器只是执行字符串替换 - 它不知道类型。 '32'将根据适用于插入的上下文的语言规则进行解释 - 通常为int

为了让您定义的值总是被看作是一个短,你可以这样做:

#define try ((short)32) 

参见:How do I write a short literal in C++?

+0

即使看起来很短,它仍然会在内存中占用4个字节,对吧? – cost 2011-05-08 18:34:44

+0

取决于平台。对于x86 Linux上的gcc,'printf(“%d \ n”,sizeof(try));'用我的表达式输出'2'。 – 2011-05-08 18:40:14

0

我会采取裂缝在这一点,但我不能完全肯定如果我是正确的

由于指令#define只是告诉预处理器与你的号码来代替尝试,它的作用,如果它只是一个值。在特定的机器上,该值将被存储在内存中的4个字节的空间中。我能想到的唯一解决方案就是使用一台机器,该机器的体系结构使用默认的16位大小作为int。

即使它很短,它仍然可能因为对齐而占用4个字节的内存,但这取决于它。

1

你所谓的常量定义,其实是一个宏定义,指出该标签将尝试通过在32预处理时间更换。

所以编译器会理解它没有指定任何类型的sizeof(32)。所以它得到了系统依赖的默认类型。

作一个简短的常数,你将有要么在定义宏来施放你的价值或初始化它作为一个全球性像如下:

const short try = 32;