Jav*_*Man 4 c++ implicit-conversion c++03
我快速浏览了 C++03 标准,但仍然无法判断这种行为是否得到保证:
\n\nsigned char cNegOne=-1; //char is 8bits\nunsigned int a=cNegOne; //int is 32 bits in my Windows system\nprintf("0x%x\\n",a);\nRun Code Online (Sandbox Code Playgroud)\n\n结果是:
\n\n0xffffffff\nRun Code Online (Sandbox Code Playgroud)\n\nVC++0xffffffff在 32 位 Windows 中提供。但我的假设是转换可能以两种方式发生:
1) 8 位有符号 char -1 首先直接转换为 8 位无符号值,即二进制 11111111 或十进制 255,然后扩展为 32 位无符号 int,也给出 255 (0xff)。
\n\n2) 8 位有符号 char -1 有符号扩展为 32 位有符号 int,给出 0xffffffff,然后重新解释为 32 位无符号 int。
\n\n显然这里使用的是第二种方式。但为什么会这样呢?在标准中,我找不到任何谈论这个的内容。它是具体实施的吗?
\n\n编辑:C++03 第 4 章的原文
\n\n标准转换是为内置类型定义的隐式转换。第 4 条列举了完整的此类转换集。标准转换序列是按以下顺序进行的标准转换序列:
\n\n\xe2\x80\x94 来自以下集合的零次或一次转换:左值到右值转换、数组到指针转换以及函数到指针转换。
\n\n\xe2\x80\x94 来自以下集合的零个或一个转换:整数提升、浮点提升、整数转换、浮点转换、浮点整数转换、指针转换、指向成员转换的指针和\n布尔转换。
\n\n\xe2\x80\x94 零或一个限定转换。
\n\n请注意,保证的顺序是 l 到右值的转换(等)发生在设置的积分提升/转换之前,但这并不意味着积分提升必须在转换之前发生 - 它们只是在同一组中。或者我的解释正确吗?
\n在 C 和 C++ 中执行整数算术时,第一步是整数提升。有符号字符和短整型变为有符号整数;无符号字符和短整型变为无符号整数。即使您将两个 Shorts 加在一起也是如此:操作本身是在整数上执行的,而不是 Shorts 上。
因此,当您考虑整数转换时,请考虑提升和符号更改。在 C++ 标准中,这两个步骤被描述为一个。也就是说,从技术上讲,不会发生单独的整数提升,但如果目标类型比源类型宽,则更改符号性的效果与显式提升先于符号性更改时发生的效果相同。基本规则是结果必须是输入模 2^n,其中 n 是输出类型的位数。对于 -1 的输入和 32 位输出类型,这意味着输出为 2^32 - 1。
| 归档时间: |
|
| 查看次数: |
988 次 |
| 最近记录: |