hengai 阅读(954) 评论(10)
今天翻看了自己的临时工程,偶然看到一段代码,于是想起了前段时间,在VCKASE上有人问一个问题,大致如下:

if(sizeof(int)==4)

{

  typedef short INT16;

}

else

{

  typedef int INT16;

}

sizeof(INT16) = ?
我一看问题,心中马上就想到:2。但是仔细想想,应该不会这么简单的,又想到可能与硬件有关,于是我回答:硬件不同结果不同。当时就想写段代码来证实(证实结果为2),咳,还没等自己想出来,周星星就贴出来了

template<size_t N> class Fuck

{

};

template<> class Fuck<2>

{

public:

    typedef int _INT16;

};

template<> class Fuck<4>

{

public:

    typedef short _INT16;

};

typedef Fuck<sizeof(int)>::_INT16 INT16;

(本人郑重声明:上面的不是我写的,请大家不要误会

经过验证,结果为 2
下面是整个的可以编译的程序

template<size_t N> class Fuck

{

};

template<> class Fuck<2>

{

public:

    typedef int _INT16;

};

template<> class Fuck<4>

{

public:

    typedef short _INT16;

};

typedef Fuck<sizeof(int)>::_INT16 INT16;

 

 

int main(int argc, char* argv[])

{

  INT16 i = (INT16)0;

  int n = sizeof(i);

  printf("sizeof(INT16)=%d, sizeof(i)=%d\n", sizeof(INT16), n);

  return 0;

}

咳,高手就是高手,我自己咋就没有想到呢?自己的基本功夫还是不扎实,没有过关啊


评论列表
周星星
re: 周星星回答的一个问题(sizeof(INT16)=?),特此记录下来
我只是想说使用 template 是一个可行的方法,但不代表我写的那段代码就good,个人认为使用 stdint.h 中的类型是最好的办法。
周星星
re: 周星星回答的一个问题(sizeof(INT16)=?),特此记录下来
顺便在这里问个相关的问题,目前win32中:
char:1byte
short:2bytes
int:4bytes
long:4bytes

当升级到64系统时,int就是8bytes了,那么就留下2个需要表示的类型,一个是2bytes,一个是4bytes,但却只有一个关键字short可用,这可如何是好?
hengai
to 周星星
这个问题啊,我都没有使用64位操作系统,不急不急di
不过,在64里面,long应该是4bytes的吧?不知道 short 是多少
周星星
to hengai:
如果这样的话,那么
sizeof( short int ) <= sizeof( int ) 我可以理解
sizeof( long int ) < sizeof( int ) 我就没法理解了
长整型还不如整型长,怎么能说“长”?
hengai
to 周星星
long 与 int 只是在16位机器上定义的,那时候,sizeof(int)=2。为了存储更大的数据,所以定义了一个long sizeof(long)=4。我记得刚学C的时候,课本上就说不同的编译器,以及不同的机器上,int的大小是不同的,但是long的大小却总是4
后来,到了32位,sizeof(int)=sizeof(long)=4,不过,为了保持兼容性,VC中自定义几种数据类型

不过,好像在 64 位操作系统中(应该还与CPU相关的),sizeof(int)=8,这是肯定的。但sizeof(long)=4,我觉得应该是这样的
gaoqing000
re: 周星星回答的一个问题(sizeof(INT16)=?),特此记录下来
template<size_t N> class Fuck

{

};
这个模板类中,<size_t N>表达一个什么意思呀?
hengai
to gaoqing000
知道 template 的作用么?如果不知道,建议你去看看C的书。
你可以把源程序编译看看,并且去除 <size_t N> 看看能否正确编译成功。
周星星
to hengai:
原来如此呀,MSDN也这么说,但当时我没相信它 :)
gyhxxl
re: 周星星回答的一个问题(sizeof(INT16)=?),特此记录下来
上面的代码用了 template 就算出 sizeof(INT16)  == 2 了 ?
那只是因为 sizeof(int) == 4 而已 。
不过用template 可以在编译时运算,是个比较好的选择。

发表评论
切换编辑模式