在C ++中键入“char”
如果你不知道你的代码运行的机器的默认设置,有没有简单的方法在char
和unsigned char
之间进行转换? (在大多数体系结构中, char
是默认签名的,因此它的范围是-128
到+127
。在其他一些体系结构(如ARM)中,默认情况下, char
是无符号的,范围从0到255)我正在查找方法来选择正确的符号或在两者之间进行透明转换,最好是不涉及太多步骤的转换,因为我需要为数组中的所有元素执行此操作。
使用预处理器定义将允许在我的代码开始时进行设置。
正如指定一个明确的char
形式,如signed char
或unsigned char
因为只有char
在平台之间是可变的。
原因是,我想使用库函数(如strtol
),它将char as an argument
但不包含unsigned char
。
我正在寻找一些建议,或者正确的方向寻找一些指向什么是实际有效的方法来实现代码的可移植性,因为我打算在一些具有不同的char
默认设置的计算机上运行代码。
在这一点上我不觉得任何实际问题。
这不是系统默认签名或未签名的问题。 这只是编译器的问题,并且可以根据需要在两个选项之间更改默认设置。
另外,不需要在类型之间进行转换。 两者在内存中具有相同的表示,位数相同(通常为8)。 这只是你的程序和它用来解释这些位的库的问题。 如果你打算调用strtol
,那么你的数据是一个字符数组,你应该使用普通char
。
如果你曾经使用char
来存储字符( A
, b
, f
...)而不是实际值(-1,0,42 ...),那么范围就很重要。 在这种情况下,你必须使用signed char
或unsigned char
。 但是在这种情况下,对于需要char *
的库函数几乎没有用处。
对于这些实际上需要char *
和实际二进制blob的库,没有问题。 用你喜欢的类型,签名,未签名或未定的类型创建你的二进制缓冲区,并发送它,可能与一个强制转换。 它将完美运行。
C ++有三种char
类型,但是只允许char
在编译器/体系结构之间变化,因为其他两种都是显式版本,并且char
是隐式的,所以它可以默认为signed
或unsigned
。
为了使代码可移植,最直接的方法是明确地根据需要使用signed
或unsigned char
,但为了便于阅读,您可能希望将char
重新定义为所需的类型,甚至可以自定义char
(为了演示目的,我将使用RLChar
)
第一版 - 取消定义字符并重新定义
#ifdef __arm__
#undef char
#define char signed char
#endif
第二版 - 定义您自己的自定义字符类型以在您的代码中使用
#ifndef RLChar
#define RLChar signed char
#endif
(我个人倾向于做第二个)
您还可以创建另一个宏以允许两者之间的更改:
#define CLAMP_VALUE_TO_255(v) ((v) > 255 ? 255 : ((v) < 0 ? 0 : (v)))
那么你可以使用:
unsigned char clampedChar = CLAMP_VALUE_TO_255((unsigned char)pixel)
或者使用类型转换(如果您将使用的所有编译器都支持它,那么这些方法就行了):
signed char myChar = -100;
unsigned char mySecondChar;
mySecondChar = static_cast<unsigned char>(myChar); // uses a static cast
mySecondChar = reinterpret_cast<unsigned char&>(myChar); // uses a reinterpretation cast
所以对于你的阵列场景你可以做
unsigned char* RLArray;
RLArray = reinterpret_cast<unsigned char*>(originalSignedCharArray);
让我知道你是否需要更多的信息,因为这正是我能够记住的头脑,特别是如果你需要C
等价物或更多的细节。 :)
上一篇: Type "char" in C++