符号属性
--
signed
unsigned
[signed]
unsigned
[signed]
unsigned
[signed]
unsigned
[signed]
unsigned
几点说明:
int、short、long也是三种互不相同的类型。可以使用C++的函数重载特性进行验证,如:
是三个不同的函数。
注意! 并不是所有编译器都这样处理,char型数据长度不一定为1字节,char也不一定为有符号型。
位。
最近在做一个项目的过程中,遇到了协议的加密解密和封装,其中经常遇到unsigned类型的数据和普通数据类型间转来转去,所以经过研究,简单封装了几个函数,在这里分享给大家,有不足之处还望大家给予指正。
unsigned short unCharToUnShort(unsigned char* pBuf)
{
unsigned short result = 0;
result = (short)pBuf[0]*256;
result += (short)pBuf[1];
return result;
}
unsigned int unCharToUnInt(unsigned char* pBuf)
{
unsigned int result = 0;
result = (short)pBuf[0]*256*256*256;
result += (short)pBuf[1]*256*256;
result += (short)pBuf[2]*256;
result += (short)pBuf[3];
return result;
}
以上两个函数是把unsigned char*转换为unsigned short或unsigned int,数据的存放方式为高字节在前,低字节在后,比如无符号短整型256是0x01 0x00。我们通过依次获取低位的数据然后乘以0xFF,来获取低位所代表的整数值,然后再把各个位的值相加,得出最终需要的无符号整形值。其中把一个字节强转为short型,就是为了获取该字节的无符号整型值,因为一个short值占两个字符,我们这样强转,其实只用了short高位的那一个字节。
void unShortToUnChar(unsigned char* pBuf,unsigned short iValue)
{
pBuf[0] = (unsigned char)(iValue>>8);
pBuf[1] = (unsigned char)(iValue);
}
void unIntToUnChar(unsigned char* pBuf,unsigned int iValue)
{
pBuf[0] = (unsigned char)(iValue>>24);
pBuf[1] = (unsigned char)(iValue>>16);
pBuf[2] = (unsigned char)(iValue>>8);
pBuf[3] = (unsigned char)(iValue);
}
以上两个函数作用是把无符号整形转换为unsigned char型。所使用的方式是把整型值右移8的倍数,然后取高位强转为unsigned char后赋值给我们的unsigned char数组中的各个字节。
在做无符号数据类型和有符号数据类型转换的时候方式有很多,此处介绍的是我觉得比较简单且易懂的,代码已在VS和linux下测试通过。大家如果有更好的方式,欢迎跟帖交流,我好对本文章进行更新,方便其它同仁学习。
和机器字长及编译器有关系:所以,int,long int,short int的宽度都可能随编译器而异。
但有几条铁定的原则(ANSI/ISO制订的):
1 sizeof(short int)<=sizeof(int)
2 sizeof(int)<=sizeof(long int)
3 short int至少应为16位(2字节)
4 long int至少应为32位。 unsigned 是无符号的意思。例如:
16位编译器
char :1个字节
char*(即指针变量): 2个字节
short int : 2个字节
int: 2个字节
unsigned int : 2个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
32位编译器
char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节64位编译器
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节