C ++有符号字符加倍
Posted
技术标签:
【中文标题】C ++有符号字符加倍【英文标题】:C++ signed char to double 【发布时间】:2011-04-07 14:58:43 【问题描述】:我是 C++ 新手,在将有符号字符转换为双精度字符时遇到问题。最初的想法是将带符号的 char 转换为 const char* 并使用 atof 返回双精度。
signed char x = '100';
const char * cChar = x;
std::cout << atof(cChar);
我可以尝试什么来解决这个问题?
【问题讨论】:
第一行不是有效的 C 或 C++。你的意思是signed char x = 100;
还是const signed char *x = "100";
?
我认为 '100' 实际上是有效的 - 一个多字符常量。它的值是'1','0'和'0'的一些编译器相关的整数函数。
@Oli:在 C++ 中,第一行是 valid,但 '100' 的值是实现定义的(它是多字符文字,2.13.2/1 ),除非该值在范围内,否则将其转换为 signed char
的结果也是实现定义的(有符号溢出,4.7/3)。在 C 语言中,我懒得在另一个标准中查找参考资料 ;-)
字符、指向字符的指针和字符串在 C++ 中都是不同的东西。我不清楚您要在哪些之间进行转换。如果x
的类型为signed char
,则const char *cChar = x
是无稽之谈。
【参考方案1】:
signed char x = 100;
double d = x;
cout << d;
const char * x = "100";
double d = atof(x);
cout << d;
'100'
错误 - 您需要 const char * x = "100";
或 char x=100
;
【讨论】:
【参考方案2】:你的意思是
const char *x = "100";
std::cout << atof(x);
?
【讨论】:
其实我觉得这可能是正确的答案,而不是我自己的。我没有发现单引号,这意味着原始海报正在尝试使用字符串。显然,混淆在于,在 C 中,char 是可用的,并且通常仅用于存储少量数字。【参考方案3】:您可能想要使用strtod()
或者您可以使用boost::lexical_cast<>
【讨论】:
【参考方案4】:我试图弄清楚你目前的理解是什么
signed char x = '100';
这行代码采用不存在的字符“100”,通常字符是一个符号,例如“a”和“9”。除非它们是特殊的不可打印序列,例如 null '\0' 或换行符 '\n',甚至是转义字符,例如单引号'\''
C 风格的字符串由双引号表示,并在末尾有一个隐藏字节,其中包含一个空终止符,双引号表示法为您处理空。
如果您希望将字符串 "100" 转换为双精度,那么以下将起作用
double a;
char b [4] = "100";
a = atof(b);
【讨论】:
【参考方案5】:应该是:
double value = static_cast<double>(x);
你目前正在做的是创建一个指向内存地址 100 的指针,你几乎肯定不拥有它,然后尝试从那里读取一个字符串,但几乎可以肯定它不存在。
(注意:我最初建议使用 C 样式版本,double value = (double)x;
,请参阅下面的 cmets,了解为什么在 C++ 中更好地避免 C 样式转换)
【讨论】:
不,这里完全错误。这里没有创建指针,这样的转换是有问题的。 然而,根据问题将“signed char to double”转换为正确的方法。在发帖时,尚不清楚发帖者是打算处理字符数组(即字符串)还是单个签名字符。 @Tommy 推荐 C++ 中的 C 风格转换是仍然错误的答案,对不起。 @Konrad:假设您已经承认“这里没有创建指针”的问题;您为什么认为 C 风格的演员表是错误的?例如,我注意到这是 cplusplus.com 上提供的第一个建议 — 请参阅 cplusplus.com/doc/tutorial/typecasting @Tommy cplusplus.com 给出了不好的建议。有关讨论,请参见 ***.com/q/527999/1968 - 这些规则在过去几年中已经非常完善。以上是关于C ++有符号字符加倍的主要内容,如果未能解决你的问题,请参考以下文章