这不是建议的做法(也不是未定义的行为),而是关于将整数类型的所有字节转换为值的c ++标准实际上保证的内容
(unsigned char)0.
在下面的代码片段中,if-statement使用的表达式是否保证在c ++ 11中被评估为true?
std::memset (
reinterpret_cast<char*> (&a), // int a;
(unsigned char)0,
sizeof (int)
);
if (a == 0) {
...
}
Run Code Online (Sandbox Code Playgroud)
通过阅读C99和C++ 11标准中的引文(在本文中进一步说明),我们发现C99明确保证所有位设置为的整数类型0将表示该0类型中的值.
我在C++ 11标准中找不到这种保证.
5.2.1.2/1多字节字符
所有位为零的字节应被解释为与移位状态无关的空字符.这样的字节不应作为任何其他多字节字符的一部分出现.
6.2.6.2/1整数类型
任何填充位的值都是未指定的.45)符号位为零的有符号整数类型的有效(非陷阱)对象表示是相应无符号类型的有效对象表示,并且应表示相同的值.
对于任何整数类型,所有位为零的对象表示应该是该类型中零值的表示.
2.3/3字符集[lex.charset]
基本执行字符集和基本执行宽字符集应各自包含基本源字符集的所有成员,以及表示alert,backspace和回车符的控制字符,以及空字符(分别为null宽字符),其表示具有全零位.
为了T使std::is_integral<T>::value && std::is_unsigned<T>::valueIS true,不C++标准保证:
std::numeric_limits<T>::max() == 2^(std::numeric_limits<T>::digits)-1
Run Code Online (Sandbox Code Playgroud)
在数学意义上?我正在寻找基于标准引用的证据.
如果C++ 14
实现在a的基础字节中包含填充位unsigned int,那么标准是否指定是否必须在填充位上执行按位运算?
另外,C++ 14标准是否指定相等和关系运算符是否必须忽略填充位?
如果在这个问题上缺乏规范,那么这些运算符在填充位上的预期行为是否存在某种共识?
我在Stack Overflow上找到了相互矛盾的答案.轨道中的亮度竞赛和ecatmur说,按位运算符不适用于算术,因为它们应用于所有位(包括填充位),而Christoph和Bartek Banachewicz表示按位运算符处理整数的逻辑值并忽略填充.
相关的答案:在填充比特的存在(1, 2, 3),在没有明确的C++规范(4).
C++中填充位的定义14 - 第3.9.1节 - 基本类型:
对于窄字符类型,对象表示的所有位都参与值表示.对于无符号窄字符类型,值表示的所有可能位模式表示数字.这些要求不适用于其他类型.
C++中对象表示和值表示的定义14 - §3.9 - 类型:
类型对象的对象表示是由类型对象占据
T的N个unsigned char对象的序列T,其中N等于sizeof(T).对象的值表示是保存type值的位集T.对于简单的可复制类型,值表示是对象表示中的一组位,用于确定值,该值是实现定义的值集的一个离散元素.44脚注44)意图是C++的内存模型与ISO/IEC 9899编程语言C的内存模型兼容.
C++中按位AND的定义14 - §5.11 - 按位AND运算符:
执行通常的算术转换; 结果是操作数的按位AND功能.运算符仅适用于整数或无范围的枚举操作数.
C++中添加的定义14 …
c++ bitwise-operators unsigned-integer unspecified-behavior c++14
所以我只是练习编码斐波那契序列的动态解决方案,它将返回第n个斐波纳契数,我不断遇到一个我无法弄清楚的问题.我得到两个正数加上负数!
码:
int fib(int n) {
vector<int> v;
v.push_back(1);
v.push_back(1);
for (int i = 2; i <= n; i++) {
v.push_back( v.at(i-1) + v.at(i-2) );
cout << v.at(i-1) << " + " << v.at(i-2) << " = " << (v.at(i-1) + v.at(i-2)) << endl;
}
return v.at(n);
}
Run Code Online (Sandbox Code Playgroud)
尝试运行fib(50),注意cout只是用于调试
