【问题标题】:Standard C++ Behavior of Signed Char to Unsigned Int Conversion有符号字符到无符号整数转换的标准 C++ 行为
【发布时间】:2017-04-22 01:15:31
【问题描述】:

我快速浏览了 C++03 标准,但仍然无法确定这种行为是否得到保证:

signed char cNegOne=-1; //char is 8bits
unsigned int a=cNegOne; //int is 32 bits in my Windows system
printf("0x%x\n",a);

结果是:

0xffffffff

VC++ 在 32 位 Windows 中提供 0xffffffff。但我的假设是转换可能以两种方式发生:

1) 8 位有符号字符 -1 首先直接转换为 8 位无符号值,即二进制 11111111 或十进制 255,然后扩展为 32 位无符号整数,也得到 255 (0xff)。

2) 8 位有符号字符 -1 被有符号扩展为 32 位有符号整数,给出 0xffffffff 然后重新解释为 32 位无符号整数。

这里显然使用了第二种方式。但为什么会这样呢?在标准中,我找不到任何关于此的内容。它是特定于实现的吗?

EDIT:C++03第4章原文

标准转换是为内置类型定义的隐式转换。第 4 条列举了所有此类转换。标准转换序列是按以下顺序进行的标准转换序列:

- 从以下集合进行零次或一次转换:左值到右值的转换、数组到指针的转换和函数到指针的转换。

- 来自以下集合的零个或一个转换:整数提升、浮点提升、整数转换、浮点转换、浮点整数转换、指针转换、指向成员的指针转换,以及 布尔转换。

— 零个或一个资格转换。

请注意,保证顺序是 l 到右值的转换(等)发生在集合积分提升/转换之前,但这并不意味着积分提升必须在转换之前发生 - 它们只是在同一个集合中. 还是我的解释正确?

【问题讨论】:

  • 您不能在同一个标​​准转换序列(“零或一”)内同时进行促销和转换。 charunsigned int 是一种积分转换。

标签: c++ implicit-conversion c++03


【解决方案1】:

在 C 和 C++ 中执行整数运算时,第一步是整数提升。签名的字符和短裤成为签名的整数;无符号字符和短裤成为无符号整数。即使您将两个短裤相加也是如此:操作本身是在整数上执行的,而不是在短裤上。

因此,当您考虑整数转换时,请先考虑提升,然后是符号变化。在 C++ 标准中,这两个步骤被描述为一个步骤。也就是说,从技术上讲,不会发生单独的整体提升,但是如果目标类型比源类型宽,则更改符号的效果与在符号更改之前进行显式提升的效果相同。基本规则是结果必须是输入模 2^n,其中 n 是输出类型的位数。对于 -1 的输入和 32 位输出类型,这意味着 2^32 - 1 的输出。

【讨论】:

    猜你喜欢
    • 2011-06-14
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 2013-09-01
    相关资源
    最近更新 更多