6
int main(void)  
{  

   unsigned i = -23; // line 1
   short a, b = 0x1;

   printf("sizeof(short) = %i\n", (int)sizeof(short)); // line 2

   a = b << 31; // line 3
   printf("i = %i", i); // line 4
   printf("i = %u", i); // line 5

   return 0;
}

为什么指定类型修饰符 unsigned 时第 1 行没有给出任何错误?

第 2 行在我的系统中打印sizeof(short)为 2 个字节。a & b 是短整数,因此 2 字节或 16 位长。但是第 3 行不会引发任何错误。当字长仅为 16 位时,如何左移 31 位?

第 4 行和第 5 行是否有任何隐式转换?

我在 64 位 Mac 上使用 GCC 编译器。

4

3 回答 3

6
  1. 您不会收到错误,因为负整数常量被隐式转换为无符号值,成为一个非常大的数字(MSB 设置为 1)
  2. 一个值被隐式转换为int1,2,移位并赋值回;当数字被转换回时,你会得到全零short,但这是一个未定义的行为3
  3. C 意义上的第 4 行和第 5 行没有转换;与将参数传递给可变参数函数相关的常规类型提升确实适用。但是,printf在第 4 行将 unsigned 重新解释为 singed:格式说明符是唯一说明printf传递给它的参数类型的内容。

1换班前促销:链接

2整数促销:链接

3移动 30 就可以了,因为2^30可以表示为int.

于 2012-07-25T04:23:37.703 回答
2

1) Negative integers are converted to unsigned by adding UINT_MAX + 1 as per point 2 of C99 6.3.1.3:

 6.3.1.3 Signed and unsigned integers
 [...]
 2 Otherwise, if the new type is unsigned, the value is converted by repeatedly
 adding or subtracting one more than the maximum value that can be represented
 in the new type until the value is in the range of the new type.

2) Operands to the bit shift operators are implicitly converted to int as per C99 6.5.7

6.5.7 Bitwise Shift Operators
1 Each of the operands shall have integer type.
2 The integer promotions are performed on each of the operands.
3 The type of the result is that of the promoted left operand.

3) See dasblinkenlight's answer.

于 2012-07-25T04:41:36.270 回答
0

分配:你给变量的类型并没有说明你可以放什么,而是编译器应该如何解释它。在您的情况下,-23 被“转换”为 32 位,然后将该值放入 unsigned int (也有 32 位)...(位长度取决于体系结构)

http://en.wikipedia.org/wiki/Two%27s_complement

移位:当您移位时,一侧的位“消失”,另一侧的位(零)必须移入。您可以将变量移位多少次。

Printfing:同样,这不是关于“转换”,而是关于“解释”一系列位。

于 2012-07-25T05:16:50.230 回答