7 c++ portability char unsigned-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.
C++ 具有三种char类型,但仅char允许在编译器/体系结构之间变化,因为其他两种是显式版本,并且char是隐式的,因此允许默认为signed或unsigned。
为了使您的代码可移植,最简单的事情就是显式地使用或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同等信息或更多详细信息。:)