Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有符号字符的整数转换_C++_Type Conversion - Fatal编程技术网

C++ 有符号字符的整数转换

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。从理论上讲,这

TCPL第3版,C.6.2.1积分转换给出了以下示例:

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]