user-0 提问: 寄存器选取问题

回复:
user: user-1
content: The following may be used in an expression wherever an int or unsigned int may be used: — An object or expression with an integer type whose integer conversion rank is less than the rank of int and unsigned int. — A bit-field of type _Bool, int, signed int, or unsigned int. If an int can represent all values of the original type, the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions. 48) All other types are unchanged by the integer promotions.

user: user-2
content: 引用 15 楼 dxcheng116 的回复:[quote=引用 14 楼 akirya 的回复:] [quote=引用 12 楼 dxcheng116 的回复:] 在这里我只看到如下这个描述，同类型的short不会提升为int 还请大神明示，谢谢！ If both operands have the same type, then no further conversion is needed.  前面还有一行，整形先进行类型提升。  Otherwise, the integer promotions are performed on both operands. Then the following rules are applied to the promoted operands:[/quote]  是这个意思吗？ 我的理解是你贴的这段前面讲的是double和float的非整数提升规则，otherwise否则的话就是整数提升规则，然后讲的具体的整数提升规则. 如果两个操作数的类型是相同的话，实际的整数提升的操作是啥都不做。  PS.在网上也搜索了一些short+short的信息，发现Java和C#是有这个规定的，例如如下代码在这两个语言中都会报编译错误。 short a = 1; short b = 2; short c = a + b; [/quote]  下面不是讲整数提升(integer promotion)规则，整数提升规则是在前面讲的： 6.3.1.1 Boolean, characters, and integers 2 The following may be used in an expression wherever an int or unsigned int may be used: — An object or expression with an integer type whose integer conversion rank is less than the rank of int and unsigned int. — A bit-field of type _Bool, int, signed int, or unsigned int. If an int can represent all values of the original type, the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions. All other types are unchanged by the integer promotions

user: user-0
content: 引用 14 楼 akirya 的回复:[quote=引用 12 楼 dxcheng116 的回复:] 在这里我只看到如下这个描述，同类型的short不会提升为int 还请大神明示，谢谢！ If both operands have the same type, then no further conversion is needed.  前面还有一行，整形先进行类型提升。  Otherwise, the integer promotions are performed on both operands. Then the following rules are applied to the promoted operands:[/quote]  是这个意思吗？ 我的理解是你贴的这段前面讲的是double和float的非整数提升规则，otherwise否则的话就是整数提升规则，然后讲的具体的整数提升规则. 如果两个操作数的类型是相同的话，实际的整数提升的操作是啥都不做。  PS.在网上也搜索了一些short+short的信息，发现Java和C#是有这个规定的，例如如下代码在这两个语言中都会报编译错误。 short a = 1; short b = 2; short c = a + b;

user: user-3
content: 引用 9 楼 dxcheng116 的回复:[quote=引用 7 楼 akirya 的回复:] [quote=引用 5 楼 dxcheng116 的回复:] [quote=引用 2 楼 akirya 的回复:] 要想达到效果强制转换一下  char r = (short)((c + 1) * 100) / (short)(a + 1);  Thanks. 不是为了达到这种效果，只是不明白为什么short类型的变量，编译器会用32位的%eax寄存器处理， 而不是选用正好16位的%ax寄存器。 [/quote] 语法规定 short+short结果是int 类型，先提升可以避免溢出，绝大多数时候是不想溢出的。[/quote]  还有这个规定，还请大神给说说是在那边规定的，谢谢！ [/quote] 这当然是C语言标准了 ISO/IEC 9899:1999 6.3.1.8 Usual arithmetic conversions

user: user-3
content: 引用 8 楼 pengzhixi 的回复:[quote=引用 7 楼 akirya 的回复:] [quote=引用 5 楼 dxcheng116 的回复:] [quote=引用 2 楼 akirya 的回复:] 要想达到效果强制转换一下  char r = (short)((c + 1) * 100) / (short)(a + 1);  Thanks. 不是为了达到这种效果，只是不明白为什么short类型的变量，编译器会用32位的%eax寄存器处理， 而不是选用正好16位的%ax寄存器。 [/quote] 语法规定 short+short结果是int 类型，先提升可以避免溢出，绝大多数时候是不想溢出的。[/quote] 我去 这都记住了！！！[/quote] 呃,只是以前遇到过这个问题而已

user: user-0
content: 引用 7 楼 akirya 的回复:[quote=引用 5 楼 dxcheng116 的回复:] [quote=引用 2 楼 akirya 的回复:] 要想达到效果强制转换一下  char r = (short)((c + 1) * 100) / (short)(a + 1);  Thanks. 不是为了达到这种效果，只是不明白为什么short类型的变量，编译器会用32位的%eax寄存器处理， 而不是选用正好16位的%ax寄存器。 [/quote] 语法规定 short+short结果是int 类型，先提升可以避免溢出，绝大多数时候是不想溢出的。[/quote]  还有这个规定，还请大神给说说是在那边规定的，谢谢！

user: user-3
content: 引用 12 楼 dxcheng116 的回复:在这里我只看到如下这个描述，同类型的short不会提升为int 还请大神明示，谢谢！ If both operands have the same type, then no further conversion is needed.  前面还有一行，整形先进行类型提升。  Otherwise, the integer promotions are performed on both operands. Then the following rules are applied to the promoted operands:

user: user-1
content: 去看看 Usual arithmetic conversions这一节

user: user-0
content: 引用 10 楼 akirya 的回复:[quote=引用 9 楼 dxcheng116 的回复:] [quote=引用 7 楼 akirya 的回复:] [quote=引用 5 楼 dxcheng116 的回复:] [quote=引用 2 楼 akirya 的回复:] 要想达到效果强制转换一下  char r = (short)((c + 1) * 100) / (short)(a + 1);  Thanks. 不是为了达到这种效果，只是不明白为什么short类型的变量，编译器会用32位的%eax寄存器处理， 而不是选用正好16位的%ax寄存器。 [/quote] 语法规定 short+short结果是int 类型，先提升可以避免溢出，绝大多数时候是不想溢出的。[/quote]  还有这个规定，还请大神给说说是在那边规定的，谢谢！ [/quote] 这当然是C语言标准了 ISO/IEC 9899:1999 6.3.1.8 Usual arithmetic conversions [/quote]  在这里我只看到如下这个描述，同类型的short不会提升为int 还请大神明示，谢谢！ If both operands have the same type, then no further conversion is needed.

user: user-1
content: 引用 7 楼 akirya 的回复:[quote=引用 5 楼 dxcheng116 的回复:] [quote=引用 2 楼 akirya 的回复:] 要想达到效果强制转换一下  char r = (short)((c + 1) * 100) / (short)(a + 1);  Thanks. 不是为了达到这种效果，只是不明白为什么short类型的变量，编译器会用32位的%eax寄存器处理， 而不是选用正好16位的%ax寄存器。 [/quote] 语法规定 short+short结果是int 类型，先提升可以避免溢出，绝大多数时候是不想溢出的。[/quote] 我去 这都记住了！！！

user: user-3
content: 引用 5 楼 dxcheng116 的回复:[quote=引用 2 楼 akirya 的回复:] 要想达到效果强制转换一下  char r = (short)((c + 1) * 100) / (short)(a + 1);  Thanks. 不是为了达到这种效果，只是不明白为什么short类型的变量，编译器会用32位的%eax寄存器处理， 而不是选用正好16位的%ax寄存器。 [/quote] 语法规定 short+short结果是int 类型，先提升可以避免溢出，绝大多数时候是不想溢出的。

user: user-0
content: 引用 3 楼 pengzhixi 的回复:因为你的+1其中的1是int型*100,100也是int型  Thanks. 先做转换为short类型也还是用的%eax寄存器。

user: user-0
content: 引用 1 楼 akirya 的回复:c + 1结果是int类型 a + 1 结果也是int类型  实际上就是int进行了计算，最后将结果转换成char类型。  Thanks. 为了避免常量1和100的影响，我把这两个数先定义为short类型，不过结果还是一样的，还是使用的%eax寄存器。  short c = 327; 80483fd:       66 c7 44 24 26 47 01    movw   $0x147,0x26(%esp)     short a = c * 2; 8048404:       0f b7 44 24 26          movzwl 0x26(%esp),%eax 8048409:       01 c0                   add    %eax,%eax 804840b:       66 89 44 24 28          mov    %ax,0x28(%esp)     short n1 = 1; 8048410:       66 c7 44 24 2a 01 00    movw   $0x1,0x2a(%esp)     short n100 = 100; 8048417:       66 c7 44 24 2c 64 00    movw   $0x64,0x2c(%esp)     char r = (c + n1) * n100 / (a + n1); 804841e:       0f bf 54 24 26          movswl 0x26(%esp),%edx 8048423:       0f bf 44 24 2a          movswl 0x2a(%esp),%eax 8048428:       01 c2                   add    %eax,%edx 804842a:       0f bf 44 24 2c          movswl 0x2c(%esp),%eax 804842f:       0f af c2                imul   %edx,%eax

user: user-0
content: 引用 2 楼 akirya 的回复:要想达到效果强制转换一下  char r = (short)((c + 1) * 100) / (short)(a + 1);  Thanks. 不是为了达到这种效果，只是不明白为什么short类型的变量，编译器会用32位的%eax寄存器处理， 而不是选用正好16位的%ax寄存器。

user: user-1
content: 因为你的+1其中的1是int型*100,100也是int型

user: user-3
content: c + 1结果是int类型 a + 1 结果也是int类型  实际上就是int进行了计算，最后将结果转换成char类型。

user: user-3
content: 要想达到效果强制转换一下  char r = (short)((c + 1) * 100) / (short)(a + 1);