short长度的问题,应该怎么做?

时间:2021-06-06 16:19:45
cha str[256] = "12dkflskdjflksjdflsdjfsdfsf";
//我要取数据的前两个字节,而且保证这两个字节是short类型的数据,下面这句大多数时候是正确的。
short s = *(short*)str;
//但有人说short不一定是两个字节,请问应该怎么做?
//WORD能保证是两个字节吗?
//double能保证是8个字节吗?

16 个解决方案

#1


标准似乎规定short就是两个字节啊,没有规定的是int

#2


1、目前来看,short基本上是16位的,以后不保证;
2、用wchar_t比较合适,它一定是两个字节。

引用 楼主 fyzqzpd 的回复:
cha str[256] = "12dkflskdjflksjdflsdjfsdfsf";
//我要取数据的前两个字节,而且保证这两个字节是short类型的数据,下面这句大多数时候是正确的。
short s = *(short*)str;
//但有人说short不一定是两个字节,请问应该怎么做?
//WORD能保证是两个字节吗?
//double能保证是8个字节吗?

#3


引用 2 楼 turingo 的回复:
1、目前来看,short基本上是16位的,以后不保证;
2、用wchar_t比较合适,它一定是两个字节。

Quote: 引用 楼主 fyzqzpd 的回复:

cha str[256] = "12dkflskdjflksjdflsdjfsdfsf";
//我要取数据的前两个字节,而且保证这两个字节是short类型的数据,下面这句大多数时候是正确的。
short s = *(short*)str;
//但有人说short不一定是两个字节,请问应该怎么做?
//WORD能保证是两个字节吗?
//double能保证是8个字节吗?


//我要取short数值,要这样吗?
wchar_t  w = *(wchar_t*)str;
short s = *(short*)w;

#4


试试就清楚了!

引用 3 楼 fyzqzpd 的回复:
Quote: 引用 2 楼 turingo 的回复:

1、目前来看,short基本上是16位的,以后不保证;
2、用wchar_t比较合适,它一定是两个字节。

Quote: 引用 楼主 fyzqzpd 的回复:

cha str[256] = "12dkflskdjflksjdflsdjfsdfsf";
//我要取数据的前两个字节,而且保证这两个字节是short类型的数据,下面这句大多数时候是正确的。
short s = *(short*)str;
//但有人说short不一定是两个字节,请问应该怎么做?
//WORD能保证是两个字节吗?
//double能保证是8个字节吗?


//我要取short数值,要这样吗?
wchar_t  w = *(wchar_t*)str;
short s = *(short*)w;

#5


不同的平台不同的编译器对数据类型定义的大小都是有区别的,如果在开发中对精度要求很高的话,可以事先检测你要用的类型是占几个字节

#6


请问 turingo,wchar_t不一定是二个字节吧,因为有些unicode编码的中文占用三个字节或4个字节。
wchar_t仅代表是宽字符,不知道说得对不对。

#7


请随便谁举一个sizeof(short)不是2的实际例子。

#8


引用 楼主 fyzqzpd 的回复:
cha str[256] = "12dkflskdjflksjdflsdjfsdfsf";
//我要取数据的前两个字节,而且保证这两个字节是short类型的数据,下面这句大多数时候是正确的。
short s = *(short*)str;
//但有人说short不一定是两个字节,请问应该怎么做?
//WORD能保证是两个字节吗?
//double能保证是8个字节吗?


请你先澄清一个问题,当short不是两字节时,你想怎么做?

#9


引用 8 楼 supermegaboy 的回复:
Quote: 引用 楼主 fyzqzpd 的回复:

cha str[256] = "12dkflskdjflksjdflsdjfsdfsf";
//我要取数据的前两个字节,而且保证这两个字节是short类型的数据,下面这句大多数时候是正确的。
short s = *(short*)str;
//但有人说short不一定是两个字节,请问应该怎么做?
//WORD能保证是两个字节吗?
//double能保证是8个字节吗?


请你先澄清一个问题,当short不是两字节时,你想怎么做?

对呀?我想问的就是如果short不是两个字节我该怎么做

#10


请原谅我的表达能力,其实我就是想知道,已知数据有两个字节是short数值,我想把它取出来,应该怎么做?

#11


引用 7 楼 zhao4zhong1 的回复:
请随便谁举一个sizeof(short)不是2的实际例子。

short能保证在绝大多数操作系统中是两个字节吗?

#12


引用 11 楼 fyzqzpd 的回复:
Quote: 引用 7 楼 zhao4zhong1 的回复:

请随便谁举一个sizeof(short)不是2的实际例子。

short能保证在绝大多数操作系统中是两个字节吗?

http://bbs.csdn.net/topics/250076957参考这个帖子,和编译器有关,但是规定short不少于16位

#13


cha str[256] = "12dkflskdjflksjdflsdjfsdfsf";
short s = *(short*)str;
assert(s==0x3231);//小端内存
assert(s==0x3132);//大端内存

#14


无码不幸福,下面是读取二进制DXF格式文件的代码
//////////////////////////////////////////////////////////////////////////
BOOL BinDxfReadLine( DXFDATA &data, DXFLINE& tm )
{
    tm.x1 = tm.y1 = tm.z1 = tm.x2 = tm.y2 = tm.z2 = 0.0;
tm.color = 9999;
tm.layer[0] = '\0';

while ( data.pIndex < data.pEnd )
{
int rec = ReadBinNumber();

switch( data.dwGcode )
{
case 10: tm.x1    = *(double*)(data.pIndex); data.pIndex+=8; break;
case 20: tm.y1    = *(double*)(data.pIndex); data.pIndex+=8; break;
case 30: tm.z1    = *(double*)(data.pIndex); data.pIndex+=8; break;
case 11: tm.x2    = *(double*)(data.pIndex); data.pIndex+=8; break;
case 21: tm.y2    = *(double*)(data.pIndex); data.pIndex+=8; break;
case 31: tm.z2    = *(double*)(data.pIndex); data.pIndex+=8; break;
case 62: tm.color = *(short* )(data.pIndex); data.pIndex+=2; break;
case 8:  ReadBinString(); strcpy( tm.layer, data.strValue ); break;
case 0:
{
if ( fabs(tm.x1-tm.x2) + fabs(tm.y1-tm.y2) < 0.000001f )
{
tm.x2 += 0.000001f;
}
if ( tm.color == 9999 )
{
tm.color = ReadLayerColor(tm.layer);
}

data.pIndex -= rec; 
}
return true;

default: ReadBinSpace(); break;
}

}

return false;
}

#15


引用 12 楼 adeng1919 的回复:
Quote: 引用 11 楼 fyzqzpd 的回复:

Quote: 引用 7 楼 zhao4zhong1 的回复:

请随便谁举一个sizeof(short)不是2的实际例子。

short能保证在绝大多数操作系统中是两个字节吗?

http://bbs.csdn.net/topics/250076957参考这个帖子,和编译器有关,但是规定short不少于16位

谢了,只要是跟编译器有关,跟系统无关那就我所谓了,反正我也不换编译器。

#16


引用 楼主 fyzqzpd 的回复:
cha str[256] = "12dkflskdjflksjdflsdjfsdfsf";
//我要取数据的前两个字节,而且保证这两个字节是short类型的数据,下面这句大多数时候是正确的。
short s = *(short*)str;
//但有人说short不一定是两个字节,请问应该怎么做?
//WORD能保证是两个字节吗?
//double能保证是8个字节吗?

stdint.h的int16_t或者uint16_t。这个标准头的内容是在配置时或者安装时生成的,理论上会配合你当前平台,提供指定长度的类型。
如果你还怕不保险,可以设个编译时检查,要求长度是2字节。

#1


标准似乎规定short就是两个字节啊,没有规定的是int

#2


1、目前来看,short基本上是16位的,以后不保证;
2、用wchar_t比较合适,它一定是两个字节。

引用 楼主 fyzqzpd 的回复:
cha str[256] = "12dkflskdjflksjdflsdjfsdfsf";
//我要取数据的前两个字节,而且保证这两个字节是short类型的数据,下面这句大多数时候是正确的。
short s = *(short*)str;
//但有人说short不一定是两个字节,请问应该怎么做?
//WORD能保证是两个字节吗?
//double能保证是8个字节吗?

#3


引用 2 楼 turingo 的回复:
1、目前来看,short基本上是16位的,以后不保证;
2、用wchar_t比较合适,它一定是两个字节。

Quote: 引用 楼主 fyzqzpd 的回复:

cha str[256] = "12dkflskdjflksjdflsdjfsdfsf";
//我要取数据的前两个字节,而且保证这两个字节是short类型的数据,下面这句大多数时候是正确的。
short s = *(short*)str;
//但有人说short不一定是两个字节,请问应该怎么做?
//WORD能保证是两个字节吗?
//double能保证是8个字节吗?


//我要取short数值,要这样吗?
wchar_t  w = *(wchar_t*)str;
short s = *(short*)w;

#4


试试就清楚了!

引用 3 楼 fyzqzpd 的回复:
Quote: 引用 2 楼 turingo 的回复:

1、目前来看,short基本上是16位的,以后不保证;
2、用wchar_t比较合适,它一定是两个字节。

Quote: 引用 楼主 fyzqzpd 的回复:

cha str[256] = "12dkflskdjflksjdflsdjfsdfsf";
//我要取数据的前两个字节,而且保证这两个字节是short类型的数据,下面这句大多数时候是正确的。
short s = *(short*)str;
//但有人说short不一定是两个字节,请问应该怎么做?
//WORD能保证是两个字节吗?
//double能保证是8个字节吗?


//我要取short数值,要这样吗?
wchar_t  w = *(wchar_t*)str;
short s = *(short*)w;

#5


不同的平台不同的编译器对数据类型定义的大小都是有区别的,如果在开发中对精度要求很高的话,可以事先检测你要用的类型是占几个字节

#6


请问 turingo,wchar_t不一定是二个字节吧,因为有些unicode编码的中文占用三个字节或4个字节。
wchar_t仅代表是宽字符,不知道说得对不对。

#7


请随便谁举一个sizeof(short)不是2的实际例子。

#8


引用 楼主 fyzqzpd 的回复:
cha str[256] = "12dkflskdjflksjdflsdjfsdfsf";
//我要取数据的前两个字节,而且保证这两个字节是short类型的数据,下面这句大多数时候是正确的。
short s = *(short*)str;
//但有人说short不一定是两个字节,请问应该怎么做?
//WORD能保证是两个字节吗?
//double能保证是8个字节吗?


请你先澄清一个问题,当short不是两字节时,你想怎么做?

#9


引用 8 楼 supermegaboy 的回复:
Quote: 引用 楼主 fyzqzpd 的回复:

cha str[256] = "12dkflskdjflksjdflsdjfsdfsf";
//我要取数据的前两个字节,而且保证这两个字节是short类型的数据,下面这句大多数时候是正确的。
short s = *(short*)str;
//但有人说short不一定是两个字节,请问应该怎么做?
//WORD能保证是两个字节吗?
//double能保证是8个字节吗?


请你先澄清一个问题,当short不是两字节时,你想怎么做?

对呀?我想问的就是如果short不是两个字节我该怎么做

#10


请原谅我的表达能力,其实我就是想知道,已知数据有两个字节是short数值,我想把它取出来,应该怎么做?

#11


引用 7 楼 zhao4zhong1 的回复:
请随便谁举一个sizeof(short)不是2的实际例子。

short能保证在绝大多数操作系统中是两个字节吗?

#12


引用 11 楼 fyzqzpd 的回复:
Quote: 引用 7 楼 zhao4zhong1 的回复:

请随便谁举一个sizeof(short)不是2的实际例子。

short能保证在绝大多数操作系统中是两个字节吗?

http://bbs.csdn.net/topics/250076957参考这个帖子,和编译器有关,但是规定short不少于16位

#13


cha str[256] = "12dkflskdjflksjdflsdjfsdfsf";
short s = *(short*)str;
assert(s==0x3231);//小端内存
assert(s==0x3132);//大端内存

#14


无码不幸福,下面是读取二进制DXF格式文件的代码
//////////////////////////////////////////////////////////////////////////
BOOL BinDxfReadLine( DXFDATA &data, DXFLINE& tm )
{
    tm.x1 = tm.y1 = tm.z1 = tm.x2 = tm.y2 = tm.z2 = 0.0;
tm.color = 9999;
tm.layer[0] = '\0';

while ( data.pIndex < data.pEnd )
{
int rec = ReadBinNumber();

switch( data.dwGcode )
{
case 10: tm.x1    = *(double*)(data.pIndex); data.pIndex+=8; break;
case 20: tm.y1    = *(double*)(data.pIndex); data.pIndex+=8; break;
case 30: tm.z1    = *(double*)(data.pIndex); data.pIndex+=8; break;
case 11: tm.x2    = *(double*)(data.pIndex); data.pIndex+=8; break;
case 21: tm.y2    = *(double*)(data.pIndex); data.pIndex+=8; break;
case 31: tm.z2    = *(double*)(data.pIndex); data.pIndex+=8; break;
case 62: tm.color = *(short* )(data.pIndex); data.pIndex+=2; break;
case 8:  ReadBinString(); strcpy( tm.layer, data.strValue ); break;
case 0:
{
if ( fabs(tm.x1-tm.x2) + fabs(tm.y1-tm.y2) < 0.000001f )
{
tm.x2 += 0.000001f;
}
if ( tm.color == 9999 )
{
tm.color = ReadLayerColor(tm.layer);
}

data.pIndex -= rec; 
}
return true;

default: ReadBinSpace(); break;
}

}

return false;
}

#15


引用 12 楼 adeng1919 的回复:
Quote: 引用 11 楼 fyzqzpd 的回复:

Quote: 引用 7 楼 zhao4zhong1 的回复:

请随便谁举一个sizeof(short)不是2的实际例子。

short能保证在绝大多数操作系统中是两个字节吗?

http://bbs.csdn.net/topics/250076957参考这个帖子,和编译器有关,但是规定short不少于16位

谢了,只要是跟编译器有关,跟系统无关那就我所谓了,反正我也不换编译器。

#16


引用 楼主 fyzqzpd 的回复:
cha str[256] = "12dkflskdjflksjdflsdjfsdfsf";
//我要取数据的前两个字节,而且保证这两个字节是short类型的数据,下面这句大多数时候是正确的。
short s = *(short*)str;
//但有人说short不一定是两个字节,请问应该怎么做?
//WORD能保证是两个字节吗?
//double能保证是8个字节吗?

stdint.h的int16_t或者uint16_t。这个标准头的内容是在配置时或者安装时生成的,理论上会配合你当前平台,提供指定长度的类型。
如果你还怕不保险,可以设个编译时检查,要求长度是2字节。