在x86_64的CentOS 7 GCC 4.8.5 C++ 11:这个表达式为什么不明确?
#include <iostream>
int main()
{
std::cout << ((ssize_t)1 - (size_t)5) << '\n';
}
// Output: 18446744073709551612
但是:
#include <iostream>
int main()
{
std::cout << ((ssize_t)1 - (unsigned int)5) << '\n';
}
// Output: -4
而且在i686的CentOS 6 GCC 4.8.2 C++ 11,他们都给予4294967292
所以我必须这样做:
#include <iostream>
int main()
{
std::cout << ((ssize_t)1 - (ssize_t)5) << '\n';
}
// Output: -4
极其人为的例子,很明显,我明白,我打依赖于平台/ impleme在积分促销规则不同条款ntation-defined type equivalences,但在星期四我的大脑无法解开它们进行严格的评估。
标准规则的序列究竟是什么使我得到这些结果?
在这两个平台中'sizeof(ssize_t)','sizeof(unsigned int)'和'sizeof(size_t)'怎么样? – max66
给定您获得的值(2^64-1和2^32-1),您可能有'sizeof(sizeize)== sizeof(ssize_t)== 8 sizeof(int)== sizeof(unsigned int)在CentOS 7上是== 4,在CentOS 6上是'sizeof(size_t)== sizeof(ssize_t)== sizeof(int)== sizeof(unsigned int)== 4',所以在后面的例子中'unsigned int '转换成'ssize_t'(相同的大小,无符号的胜利),而在另一个中则得到相反的结果(较大的胜利)。 – Holt