【问题标题】:Decrementing size_t on the right hand of assignment减少赋值右侧的 size_t
【发布时间】:2020-04-10 09:50:24
【问题描述】:

为什么在这种情况下idx1 -1?

long long idx = (size_t)0 - 1;

cout << (size_t)0 - 1; 这打印ULLONG_MAX

cout << idx; 这打印 -1

如果idx 改为整数会有什么变化?

【问题讨论】:

  • 在 Visual Studio 2019 C++ 编译器上,我得到了两者的 UINT_MAX,我认为这是正确的行为。
  • 有趣,gcc 不同意:ideone.com/XGptUJ
  • 是的。这很奇怪。
  • long long idx = {(size_t)0 - 1}; 在 gcc 上做了什么?
  • 区别在于sizeof(size_t)在VS上是4个字节,在gcc上是8个字节。

标签: c++ variable-assignment size-t


【解决方案1】:

在此声明中

cout << (size_t)0 - 1;

由于通常的算术转换,表达式(size_t)0 - 1 的类型是无符号整数类型size_t。因为它不能为负数,所以它的值为ULLONG_MAX(似乎在使用的系统中,类型 size_t 被定义为类型unsigned long long int 的别名)。

在此声明中

long long idx = (size_t)0 - 1;

初始化器被转换为有符号类型 long long int,即声明对象的类型。 UNIT_MAX 值不能放入 signed long long,因此它给出 -1。

由于使用系统中size_t类型的宽度与long long int类型的宽度相同。所以 size_t 类型的初始化器的内部表示被解释为 long long 类型的值,即无符号初始化器的最高有效位被认为是符号位.int。

【讨论】:

  • 当然,表达式(size_t)0 - 1 是无符号的,无论它被分配到何种类型。
  • @JasperKent 在初始化过程中,表达式被转换为初始化对象类型的值。
  • 您能指出文档中的一些规则吗?我不知道这应该如何工作。
  • @JKS 阅读有关常用算术转换的 C 标准。
  • 但在long long idx = (size_t)0 - 1; 的情况下,它是按位转换,而不是算术转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 2014-06-17
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
相关资源
最近更新 更多