相关疑难解决方法(0)

将int的所有字节设置为(unsigned char)0,保证代表零?

这不是建议的做法(也不是未定义的行为),而是关于将整数类型的所有字节转换为值的c ++标准实际上保证的内容(unsigned char)0.


问题

在下面的代码片段中,if-statement使用的表达式是否保证在被评估为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标准中找不到这种保证.

  • 没有这样的保证吗?
  • 上一个代码段的结果是否真的特定于实现?


在C99(ISO/IEC 9899:1999)

5.2.1.2/1多字节字符

所有位为零的字节应被解释为与移位状态无关的空字符.这样的字节不应作为任何其他多字节字符的一部分出现.

6.2.6.2/1整数类型

任何填充位的值都是未指定的.45)符号位为零的有符号整数类型的有效(非陷阱)对象表示是相应无符号类型的有效对象表示,并且应表示相同的值.

对于任何整数类型,所有位为零的对象表示应该是该类型中零值的表示.



在C++ 11(ISO/IEC 14882:2011)中

2.3/3字符集[lex.charset]

基本执行字符集和基本执行宽字符集应各自包含基本源字符集的所有成员,以及表示alert,backspace和回车符的控制字符,以及空字符(分别为null宽字符),其表示具有全零位.

c++ language-lawyer c++11

43
推荐指数
1
解决办法
3762
查看次数

C++标准是否要求最大无符号整数的形式为2 ^ N-1?

为了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++ standards unsigned language-lawyer c++11

20
推荐指数
2
解决办法
966
查看次数

C++ 14是否在unsigned int的填充位上定义了按位运算符的行为?

C++标准

如果C++ 14 实现在a的基础字节中包含填充位unsigned int,那么标准是否指定是否必须在填充位上执行按位运算?

另外,C++ 14标准是否指定相等和关系运算符是否必须忽略填充位?

方针

如果在这个问题上缺乏规范,那么这些运算符在填充位上的预期行为是否存在某种共识?

我在Stack Overflow上找到了相互矛盾的答案.轨道中的亮度竞赛ecatmur说,按位运算符不适用于算术,因为它们应用于所有位(包括填充位),而ChristophBartek Banachewicz表示按位运算符处理整数的逻辑值并忽略填充.

参考

相关的答案:在填充比特的存在(1, 2, 3),在没有明确的C++规范(4).

C++中填充位的定义14 - 第3.9.1节 - 基本类型:

对于窄字符类型,对象表示的所有位都参与值表示.对于无符号窄字符类型,值表示的所有可能位模式表示数字.这些要求不适用于其他类型.

C++中对象表示和值表示的定义14 - §3.9 - 类型:

类型对象的对象表示是由类型对象占据TN个 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

10
推荐指数
1
解决办法
492
查看次数

C++数字增加了一个负数

所以我只是练习编码斐波那契序列的动态解决方案,它将返回第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只是用于调试

在此输入图像描述

c++

2
推荐指数
1
解决办法
3083
查看次数