user-0 提问: 请教个问题！关于运算中的数据类型

回复:
user: user-1
content: 测了一下，VC10,，转换类型没有转换其二进制值，也就是说类型转换其二进制值不变

user: user-2
content: 4.5 Integral promotions [conv.prom] 1 A prvalue of an integer type other than bool, char16_t, char32_t, or wchar_t whose integer conversion rank (4.13) is less than the rank of int can be converted to a prvalue of type int if int can represent all the values of the source type; otherwise, the source prvalue can be converted to a prvalue of type unsigned int. 2 A prvalue of type char16_t, char32_t, or wchar_t (3.9.1) can be converted to a prvalue of the first of the following types that can represent all the values of its underlying type: int, unsigned int, long int, unsigned long int, long long int, or unsigned long long int. If none of the types in that list can represent all the values of its underlying type, a prvalue of type char16_t, char32_t, or wchar_t can be converted to a prvalue of its underlying type. § 4.5 ISO/IEC 14882:2011(E) 83 © ISO/IEC 2011 – All rights reserved 3 A prvalue of an unscoped enumeration type whose underlying type is not fixed (7.2) can be converted to a prvalue of the first of the following types that can represent all the values of the enumeration (i.e., the values in the range b min to b max as described in 7.2): int, unsigned int, long int, unsigned long int, long long int, or unsigned long long int. If none of the types in that list can represent all the values of the enumeration, a prvalue of an unscoped enumeration type can be converted to a prvalue of the extended integer type with lowest integer conversion rank (4.13) greater than the rank of long long in which all the values of the enumeration can be represented. If there are two such extended types, the signed one is chosen. 4 A prvalue of an unscoped enumeration type whose underlying type is fixed (7.2) can be converted to a prvalue of its underlying type. Moreover, if integral promotion can be applied to its underlying type, a prvalue of an unscoped enumeration type whose underlying type is fixed can also be converted to a prvalue of the promoted underlying type. 5 A prvalue for an integral bit-field (9.6) can be converted to a prvalue of type int if int can represent all the values of the bit-field; otherwise, it can be converted to unsigned int if unsigned int can represent all the values of the bit-field. If the bit-field is larger yet, no integral promotion applies to it. If the bit-field has an enumerated type, it is treated as any other value of that type for promotion purposes. 6 A prvalue of type bool can be converted to a prvalue of type int, with false becoming zero and true becoming one. 7 These conversions are called integral promotions .

user: user-2
content: 引用 15 楼 Czui1990 的回复:你好，两个变量相乘，提升数据长度C语言有明确的定义吗？或者说C语言如何定义类似的情况的？ http://download.csdn.net/detail/user-2/8513111  这里是c++11的ISO文档, 4.5章 因为我给你都说过了, 显然没说明白.所以自己看吧.不过是英文的.

user: user-0
content: 引用 14 楼 user-2 的回复:[quote=引用 13 楼 Czui1990 的回复:] [quote=引用 10 楼 user-2 的回复:] [quote=引用 5 楼 Czui1990 的回复:] user-2你好，你的意思是，因为Sa1_Inport,Sa1_Sign是定义成int16的，所以运算前会转成int16，然后把变量都强制转换成Uint16之后，得出的结果还是会转换为Int类型的进行计算。 但这应该不存在装不下的问题吧，因为计算的结果我没有赋给任何一个变量。 char-a* int-b, 结果是int, 假如a*b超过int范围了, 不会自动变成unsigned int char-a* unsigned int-b, 结果是unsigned int[/quote]  你好，这个我清楚，但问题是int16类型变量强制转换成uint16类型相乘后，我并没有把这个值赋给任何一个变量，所以不存在溢出或超范围的情况，而是直接把这个值去参与比大小的运算，那么这个值是int类型的呢？还是uint类型？是否变成32bit？[/quote] 因为(UInt16)Sa1_InPort)和 ((UInt16) Sa1_Sign)都先提升到int32,所以结果也是int32 [/quote]  你好，两个变量相乘，提升数据长度C语言有明确的定义吗？或者说C语言如何定义类似的情况的？

user: user-2
content: 引用 13 楼 Czui1990 的回复:[quote=引用 10 楼 user-2 的回复:] [quote=引用 5 楼 Czui1990 的回复:] user-2你好，你的意思是，因为Sa1_Inport,Sa1_Sign是定义成int16的，所以运算前会转成int16，然后把变量都强制转换成Uint16之后，得出的结果还是会转换为Int类型的进行计算。 但这应该不存在装不下的问题吧，因为计算的结果我没有赋给任何一个变量。 char-a* int-b, 结果是int, 假如a*b超过int范围了, 不会自动变成unsigned int char-a* unsigned int-b, 结果是unsigned int[/quote]  你好，这个我清楚，但问题是int16类型变量强制转换成uint16类型相乘后，我并没有把这个值赋给任何一个变量，所以不存在溢出或超范围的情况，而是直接把这个值去参与比大小的运算，那么这个值是int类型的呢？还是uint类型？是否变成32bit？[/quote] 因为(UInt16)Sa1_InPort)和 ((UInt16) Sa1_Sign)都先提升到int32,所以结果也是int32

user: user-0
content: 引用 10 楼 user-2 的回复:[quote=引用 5 楼 Czui1990 的回复:] user-2你好，你的意思是，因为Sa1_Inport,Sa1_Sign是定义成int16的，所以运算前会转成int16，然后把变量都强制转换成Uint16之后，得出的结果还是会转换为Int类型的进行计算。 但这应该不存在装不下的问题吧，因为计算的结果我没有赋给任何一个变量。 char-a* int-b, 结果是int, 假如a*b超过int范围了, 不会自动变成unsigned int char-a* unsigned int-b, 结果是unsigned int[/quote]  你好，这个我清楚，但问题是int16类型变量强制转换成uint16类型相乘后，我并没有把这个值赋给任何一个变量，所以不存在溢出或超范围的情况，而是直接把这个值去参与比大小的运算，那么这个值是int类型的呢？还是uint类型？是否变成32bit？

user: user-2
content: 去这个网站. 可以在线编译运行代码的. http://ideone.com/

user: user-2
content: 引用 9 楼 Czui1990 的回复:[quote=引用 7 楼 worldy 的回复:] 上机试一下，看看编译器是怎么处理的  你好，我这没有VC之类的工具，公司电脑安装软件还需要向IT部门申请，很麻烦。[/quote]  去这个网站. 可以在线编译运行代码的.

user: user-2
content: 引用 5 楼 Czui1990 的回复:user-2你好，你的意思是，因为Sa1_Inport,Sa1_Sign是定义成int16的，所以运算前会转成int16，然后把变量都强制转换成Uint16之后，得出的结果还是会转换为Int类型的进行计算。 但这应该不存在装不下的问题吧，因为计算的结果我没有赋给任何一个变量。 char-a* int-b, 结果是int, 假如a*b超过int范围了, 不会自动变成unsigned int char-a* unsigned int-b, 结果是unsigned int

user: user-0
content: 引用 7 楼 worldy 的回复:上机试一下，看看编译器是怎么处理的  你好，我这没有VC之类的工具，公司电脑安装软件还需要向IT部门申请，很麻烦。

user: user-0
content: 之前的回复写错了，应该是若是32bit的，此时如何看待这32bit的值，是int类型还是uint类型？

user: user-1
content: 上机试一下，看看编译器是怎么处理的

user: user-0
content: 引用 4 楼 user-2 的回复:你可以理解成, 运算中的每一个步骤都是以int(unsigned int)来运算的 是这样的.Sa1_InPort Sa1_Sign 在运算之前会转成int(unsigned int) (UInt16)Sa1_InPort你强转了之后, 还是会先转成int((unsigned int)在运算  是运算之前转, 运算过程中还是会越界的  引用 2 楼 Czui1990 的回复:[quote=引用 1 楼 user-2 的回复:] 转int, int装不下转unsigned int  user-2你好，也就是说得出的值是32位的对吧？如果int32装不下，我的理解就是溢出了，得到一个不确定的值，难道会自动转成Uint32吗？  另外如果我需要两个int32相乘，得出的结果按uint16和C1比较大小，但我没有加上强制说明转换符，是不是会得出unexpected result。[/quote]  1是不会自动转Uint32. 2. a*b>c, abc都先提升到int(或unsigned int), 之后才运行.a32*b32>c32[/quote]  你好，抱歉，我还是没有明白你的意思，运算前到底先转成int还是uint呢？两个16bit的变量强制转换uint类型相乘后，得出的结果是32bit的吗？若是32bit 的，此时是如何看待这32bit的变量，int类型还是uint类型？

user: user-0
content: 引用 3 楼 user-2 的回复:[quote=引用 2 楼 Czui1990 的回复:] [quote=引用 1 楼 user-2 的回复:] 转int, int装不下转unsigned int  user-2你好，也就是说得出的值是32位的对吧？如果int32装不下，我的理解就是溢出了，得到一个不确定的值，难道会自动转成Uint32吗？  另外如果我需要两个int32相乘，得出的结果按uint16和C1比较大小，但我没有加上强制说明转换符，是不是会得出unexpected result。[/quote]  是这样的.Sa1_InPort Sa1_Sign 在运算之前会转成int(unsigned int) (UInt16)Sa1_InPort你强转了之后, 还是会先转成int((unsigned int)在运算[/quote]  user-2你好，你的意思是，因为Sa1_Inport,Sa1_Sign是定义成int16的，所以运算前会转成int16，然后把变量都强制转换成Uint16之后，得出的结果还是会转换为Int类型的进行计算。 但这应该不存在装不下的问题吧，因为计算的结果我没有赋给任何一个变量。

user: user-2
content: 你可以理解成, 运算中的每一个步骤都是以int(unsigned int)来运算的 是这样的.Sa1_InPort Sa1_Sign 在运算之前会转成int(unsigned int) (UInt16)Sa1_InPort你强转了之后, 还是会先转成int((unsigned int)在运算[/quote]  是运算之前转, 运算过程中还是会越界的  引用 2 楼 Czui1990 的回复:[quote=引用 1 楼 user-2 的回复:] 转int, int装不下转unsigned int  user-2你好，也就是说得出的值是32位的对吧？如果int32装不下，我的理解就是溢出了，得到一个不确定的值，难道会自动转成Uint32吗？  另外如果我需要两个int32相乘，得出的结果按uint16和C1比较大小，但我没有加上强制说明转换符，是不是会得出unexpected result。[/quote]  1是不会自动转Uint32. 2. a*b>c, abc都先提升到int(或unsigned int), 之后才运行.a32*b32>c32

user: user-2
content: 引用 2 楼 Czui1990 的回复:[quote=引用 1 楼 user-2 的回复:] 转int, int装不下转unsigned int  user-2你好，也就是说得出的值是32位的对吧？如果int32装不下，我的理解就是溢出了，得到一个不确定的值，难道会自动转成Uint32吗？  另外如果我需要两个int32相乘，得出的结果按uint16和C1比较大小，但我没有加上强制说明转换符，是不是会得出unexpected result。[/quote]  是这样的.Sa1_InPort Sa1_Sign 在运算之前会转成int(unsigned int) (UInt16)Sa1_InPort你强转了之后, 还是会先转成int((unsigned int)在运算

user: user-0
content: 引用 1 楼 user-2 的回复:转int, int装不下转unsigned int  user-2你好，也就是说得出的值是32位的对吧？如果int32装不下，我的理解就是溢出了，得到一个不确定的值，难道会自动转成Uint32吗？  另外如果我需要两个int32相乘，得出的结果按uint16和C1比较大小，但我没有加上强制说明转换符，是不是会得出unexpected result。

user: user-2
content: 转int, int装不下转unsigned int