s********k 发帖数: 6180 | 1 signed char sc = SCHAR_MAX;
unsigned char uc = UCHAR_MAX;
signed long long sll = sc + uc;
这个里面signed被promotion到unsigned,但是uc也要被conversion(UCHAR_MAX to
UINT_MAX),为什么uc也要被conversion到UINT_MAX呢?这个计算最后会overflow? | t****t 发帖数: 6806 | 2 Only types are promoted, values are not. for arithmetic operators, if none
of the operands is floating point, integral promotion will be performed
first, in your case both operands are promoted to int. so the result shall
be SCHAR_MAX+UCHAR_MAX = 127+255=382.
【在 s********k 的大作中提到】 : signed char sc = SCHAR_MAX; : unsigned char uc = UCHAR_MAX; : signed long long sll = sc + uc; : 这个里面signed被promotion到unsigned,但是uc也要被conversion(UCHAR_MAX to : UINT_MAX),为什么uc也要被conversion到UINT_MAX呢?这个计算最后会overflow?
| s********k 发帖数: 6180 | 3 我也觉得你的这个是对的。跑了一下也是
https://www.securecoding.cert.org/confluence/display/seccode/INT02-C.+
Understand+integer+conversion+rules
我是看这个链接,里面说
because uc is equal to UCHAR_MAX, which is equal to UINT_MAX, the addition
results in an overflow in this example.
十分不解,看来这个是错的。
【在 t****t 的大作中提到】 : Only types are promoted, values are not. for arithmetic operators, if none : of the operands is floating point, integral promotion will be performed : first, in your case both operands are promoted to int. so the result shall : be SCHAR_MAX+UCHAR_MAX = 127+255=382.
| s********k 发帖数: 6180 | 4 比如
unsigned int a = 2;
int b = -3;
做 a+b.
-2会被convert成0x11111101,a+b会overflow结果是UINT_MAX?
【在 t****t 的大作中提到】 : Only types are promoted, values are not. for arithmetic operators, if none : of the operands is floating point, integral promotion will be performed : first, in your case both operands are promoted to int. so the result shall : be SCHAR_MAX+UCHAR_MAX = 127+255=382.
| t****t 发帖数: 6806 | 5 你如果非要用unsigned来表示-1, 那不就是UINT_MAX吗? 如果你把UINT_MAX赋给一个
signed int, 不就又回到-1了吗?
而且这跟你先前提的问题没有关系啊.
【在 s********k 的大作中提到】 : 比如 : unsigned int a = 2; : int b = -3; : 做 a+b. : -2会被convert成0x11111101,a+b会overflow结果是UINT_MAX?
| s********k 发帖数: 6180 | 6 这个跟我前面问题没关系,这个就是我随便举的一个例子,那个是链接里面直接把
Unsigned char promote 成unsigned INT,我指的的value。还是一个貌似权威的网站
【在 t****t 的大作中提到】 : 你如果非要用unsigned来表示-1, 那不就是UINT_MAX吗? 如果你把UINT_MAX赋给一个 : signed int, 不就又回到-1了吗? : 而且这跟你先前提的问题没有关系啊.
| t****t 发帖数: 6806 | 7 错的明明是你, 这里面说得很清楚:
"... However, if the compiler represents the signed char and unsigned char
types using 31- and 32-bit precision (respectively), ..."
有个大大的IF, 你不看的吗?
当然, 这里面说signed char是7bit precision是不对的, 符号难道不算精度么.
【在 s********k 的大作中提到】 : 我也觉得你的这个是对的。跑了一下也是 : https://www.securecoding.cert.org/confluence/display/seccode/INT02-C.+ : Understand+integer+conversion+rules : 我是看这个链接,里面说 : because uc is equal to UCHAR_MAX, which is equal to UINT_MAX, the addition : results in an overflow in this example. : 十分不解,看来这个是错的。
| s********k 发帖数: 6180 | 8 you are right.我土了
【在 t****t 的大作中提到】 : 错的明明是你, 这里面说得很清楚: : "... However, if the compiler represents the signed char and unsigned char : types using 31- and 32-bit precision (respectively), ..." : 有个大大的IF, 你不看的吗? : 当然, 这里面说signed char是7bit precision是不对的, 符号难道不算精度么.
|
|