这是C++引入新的Casic风格的原因之一,包括static_cast
和reinterpret_cast
.
从有符号到无符号的转换有两个意思,你可能希望无符号变量包含有符号变量的值,该值除以无符号类型的最大值+1.也就是说,如果您的签名字符的值为-128,那么将为128的值添加CHAR_MAX+1
,如果它的值为-1,那么将为255的值添加CHAR_MAX+1
,这就是静态_cast所做的.另一方面,您可能意味着将某个变量引用的内存的位值解释为无符号字节,而不管系统上使用的是有符号整数表示,也就是说,如果它的位值为0b10000000
,则应计算为128,而位值为0b11111111
,则应计算为255,这是通过重新解释_cast实现的.
现在,对于二者的补码表示,这恰好是完全相同的事情,因为-128表示为0b10000000
,-1表示为0b11111111
,对于两者之间的所有事物也是如此.然而,其他计算机(通常是较旧的体系 struct )可能会使用不同的符号表示,例如符号和大小或1的补码.在one的补码中,0b10000000
位的值不是-128,而是-127,因此对unsigned char的静态转换将使其为129,而对reinterpret_的转换将使其为128.此外,在"一"的补码中,0b11111111
位的值不是-1,而是-0(是的,这个值存在于"一"的补码中),并将通过静态转换转换为0,但通过重新解释转换转换为255.注意,在"1"补码的情况下,128的无符号值实际上不能用有符号字符表示,因为它的范围是-127到127,这是由于-0的值.
我不得不说,绝大多数计算机将使用二的补码,这使得整个问题在你的代码运行的任何地方都变得毫无意义.在非常古老的体系 struct 中,你可能只会看到除了两个系统之外的任何系统,想想60年代的时间框架.
语法可归结为以下几点:
signed char x = -100;
unsigned char y;
y = (unsigned char)x; // C static
y = *(unsigned char*)(&x); // C reinterpret
y = static_cast<unsigned char>(x); // C++ static
y = reinterpret_cast<unsigned char&>(x); // C++ reinterpret
用一个好的C++方式来做这些事情:
jbyte memory_buffer[nr_pixels];
unsigned char* pixels = reinterpret_cast<unsigned char*>(memory_buffer);
或者C方式:
unsigned char* pixels = (unsigned char*)memory_buffer;