考虑以下代码:
typedef union
{
int integer_;
char mem_[4];
} MemoryView;
int main()
{
MemoryView mv;
mv.integer_ = (int)'\xff';
for(int i=0;i<4;i++)
std::cout << mv.mem_[i]; // output is \xff\xff\xff\xff
mv.integer_ = 0xff;
for(int i=0;i<4;i++)
std::cout << mv.mem_[i]; // output is \xff\x00\x00\x00
// now i try with a value less than 0x80
mv.integer_ = (int)'\x7f'
for(int i=0;i<4;i++)
std::cout << mv.mem_[i]; // output is \x7f\x00\x00\x00
mv.integer_ = 0x7f;
for(int i=0;i<4;i++)
std::cout << mv.mem_[i]; // output is \x7f\x00\x00\x00
// now i try with 0x80
mv.integer_ = (int)'\x80'
for(int i=0;i<4;i++)
std::cout << mv.mem_[i]; // output is \x80\xff\xff\xff
mv.integer_ = 0x80;
for(int i=0;i<4;i++)
std::cout << mv.mem_[i]; // output is \x80\x00\x00\x00
}
我用GCC4.6和MSVC2010进行了测试,结果是相同的。
当我尝试使用小于0x80的值输出是正确的但具有大于0x80的值时,
剩下的三个字节是'\ xff'。
中央处理器(CPU):Intel'core 2 Duo'
字节序:小
操作系统:Ubuntu 12.04LTS(64bit),Windows 7(64 bit)
最佳答案
'\xff'
的类型是char
。 char
是许多平台上的带符号整数类型,因此'\xff
的值为负(-1
而不是255
)。当您将其转换(投射)为int
(也已签名)时,会得到一个具有相同负值的int值。
严格小于0x80
的任何内容都将是肯定的,您将从转换中获得肯定。
关于c++ - 为什么(int )'\xff'!= 0xff但是(int )'\x7f' == 0x7f?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17896321/