在C++中键入"char"

7 c++ portability char unsigned-char

是否有一种简单的方法进行转换char,unsigned char如果您不知道代码运行的机器的默认设置?(在大多数体系结构中,char默认情况下是签名的,因此范围从-128+127.在其他一些体系结构中,例如ARM,char默认情况下是无符号的,范围从0到255)我正在寻找一种方法来选择正确的签名或透明地转换两者,最好是不涉及太多步骤的一个,因为我需要对数组中的所有元素执行此操作.

使用预处理器定义将允许在我的代码开头设置它.
如将指定的显式形式char,例如signed charunsigned char作为仅char是平台之间可变.

原因是,我想使用的库函数(例如strtol)接受char as an argument但不是unsigned char.

我正在寻找一些建议,或者正确的方向指出一些实用的高效方法,以便使代码可移植,因为我打算在具有不同默认设置的几台机器上运行代码char.

GMa*_*cci 1

C++ 具有三种char类型,但仅char允许在编译器/体系结构之间变化,因为其他两种是显式版本,并且char是隐式的,因此允许默认为signedunsigned

为了使您的代码可移植,最简单的事情就是显式地使用或signed根据unsigned char您的需要,但是为了可读性,您可能更愿意将chara 重新定义为您需要的类型,甚至可以自己定义 a char(出于演示目的,我将使用RLChar

第一个版本 - 取消定义 char 并重新定义

#ifdef __arm__
#undef char
#define char signed char
#endif
Run Code Online (Sandbox Code Playgroud)

第二个版本 - 定义您自己的自定义字符类型以在代码中使用

#ifndef RLChar
#define RLChar signed char
#endif
Run Code Online (Sandbox Code Playgroud)

(我个人倾向于做第二个)

您还可以创建另一个宏以允许两者之间进行更改:

#define CLAMP_VALUE_TO_255(v) ((v) > 255 ? 255 : ((v) < 0 ? 0 : (v)))
Run Code Online (Sandbox Code Playgroud)

那么你可以使用:

unsigned char clampedChar = CLAMP_VALUE_TO_255((unsigned char)pixel)
Run Code Online (Sandbox Code Playgroud)

或使用诸如以下的强制转换(如果您将使用的所有编译器都支持它,则可以采用这些方法):

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
Run Code Online (Sandbox Code Playgroud)

所以对于你的数组场景你可以这样做

unsigned char* RLArray;
RLArray = reinterpret_cast<unsigned char*>(originalSignedCharArray); 
Run Code Online (Sandbox Code Playgroud)

如果您需要更多信息,请告诉我,因为这只是我能立即记住的信息,特别是如果您需要C同等信息或更多详细信息。:)