我们毫无疑问地知道,ISO C标准(以及C++,我认为,虽然我对C方面更感兴趣)允许签名数字的三个基础表示:
维基百科的条目表明,60年代的IBM 7090使用了标志/幅度,PDP-1,CDC 160A和UNIVAC 1100使用的是补充,所有这些都可以追溯到60年代.
是否有其他任何具有这些替代表示的C(或底层硬件)实现,这些实现比五十年前更新了(它们是什么)?
对于不再存在的机器,保持某种标准似乎有点浪费.
新的C++标准仍然拒绝指定整数类型的二进制表示.这是因为C++的实际实现不使用2的补码算法吗?我觉得很难相信.是不是因为委员会担心硬件的未来发展会让"过时"的概念变得过时?再次难以置信.任何人都可以对此有所了解吗?
背景:我在一个评论帖中惊讶两次(Benjamin Lindley对这个问题的回答).首先,来自piotr的评论:
签名类型的右移是未定义的行为
其次,来自James Kanze的评论:
当分配给long时,如果该值不适合long,则结果是实现定义的
在我相信之前,我必须在标准中查看这些内容.它们的唯一原因是适应非二进制补码整数表示.为什么?
因此,我的教授有一个问题要列出所有正数和负数,这些数字可以用一个,二个补码和符号量表示:
使用4位数,例如(5)10 =(0101)2写出所有正数和所有负数,可以用符号幅度,1的补码和2的补码表示4位.
现在,我不是在寻找澄清的答案.
谁能更好地解释这个问题?