C++ 有符号字符的整数转换
TCPL第3版,C.6.2.1积分转换给出了以下示例:C++ 有符号字符的整数转换,c++,type-conversion,C++,Type Conversion,TCPL第3版,C.6.2.1积分转换给出了以下示例: signed char c = 1023; // implementation defined 合理的结果为255和-1 C.3.4 如果目标机器使用2s补码,则获得-1选项 什么样的“签名”实现会产生255?编译器可以随意将静态初始化器替换为=255 但是我想说的是,寻找这个问题的答案是错误的C++编程方法。这本书教你C++,而不是关于特定的计算机。代码符合标准,您就不会有任何问题。老实说,我知道没有任何实现会导致255。从理论上讲,这
signed char c = 1023; // implementation defined
合理的结果为255和-1 C.3.4
如果目标机器使用2s补码,则获得-1选项
什么样的“签名”实现会产生255?编译器可以随意将静态初始化器替换为
=255
<>但是我想说的是,寻找这个问题的答案是错误的C++编程方法。这本书教你C++,而不是关于特定的计算机。代码符合标准,您就不会有任何问题。老实说,我知道没有任何实现会导致255。从理论上讲,这是可能的,但对于有符号的字符,其值为255,字符类型应至少有9位:8位表示数据值,1位表示符号 但是,当您将无法表示为有符号类型的值转换为有符号类型时,结果取决于实现(*),因此对于任何大于它的整数值(即127),它都可以合法地为MAX_CHAR。或者,实现可以选择将不可接受的值转换为0 无论如何,它与负值的表示无关。除了常见的实现使用2的补码,并简单地保留以-1结尾的最低阶位 但普通实现的真实情况是:
char c = 1023; // plausible values are -1 (default char is signed) or 255 (default unsigned)
(*)参考文献: 来自C++14的n4296草稿 4.7积分转换[conv.Integral]
…
虽然我同意你的一般评论,但我认为这是一个公平而有趣的问题,要求对C++标准和兼容的实现有更深入的理解(如在选择“一时兴起”的另一个值)可能不符合标准,遵循GRO++ C++标准细节)。不过,考虑到StackOverflow涉及实际编程问题,它可能并不完全适合。这个答案澄清了结果实际上可能是任何东西。我认为可能会有更深层次的事情发生,但这表明结果可能是任意的。你可以试着问比亚恩·斯特劳斯鲁普[他的主页][在他的大学里查阅][linkedin]