【发布时间】:2013-06-09 04:08:58
【问题描述】:
我有以下类,它应该代表一个 8 位有符号字符。
class S8
{
private:
signed char val;
public:
S8 & operator=(const signed char other)
{
if ((void*)this != (void*)&other)
{
val = other;
}
return *this;
}
operator signed char() {signed char i; i = (signed char) val; return i;}
void write (OutputArray & w)
{
/* This function is the whole purpose of this class, but not this question */
}
};
但是,当我将负数分配给它的一个对象时,
S8 s;
char c;
s = -4;
c = -4;
printf("Results: %d, %s\n",s,c);
我从 printf 中得到“结果:252,-4”。有什么方法可以修改类,这样这样的情况会看到有符号字符的行为,而不是我得到的无符号字符行为?
谢谢!
【问题讨论】:
-
未定义的行为:不使用
printf的充分理由。 -
你的重载赋值运算符真的很奇怪。您的地址检查永远不会是真的(无论如何请参阅复制交换),您甚至不需要重载它。只需有一个来自
signed char的转换构造函数。您的转换运算符也可以是return val;。 -
printf 只是一个健全的检查,以确保我没有丢失标志。我想我会看到负数,而不是二进制补码。很高兴知道只是我不知道如何使用 printf,谢谢!我将研究赋值运算符...它是来自不同 SO 问题的复制/粘贴,我没有考虑太多
-
为什么要为签名字符创建一个类?这似乎毫无意义。
-
对于 %s 格式,您必须传递 const char* 指向以 0 结尾的字符串。对于 char,您必须使用 %c。这样你就有了UB。并且通过非 POD 作为您的课程也是 UB
标签: c++