C语言中的int、unsigned int 中的负数存取、隐式转换、越界等问题
#include "stdio.h"
int main() {
// Tips:
// PC上 int 32 位,4字节
// 补码: 正数取反 再加一
// 隐式转化: 不同类型变量计算时,由低精度向高精度转换
// unsigned int a = -6; --> 不报错
// 将以补码的形式存于a对于的地址空间,a = 1111 1111 1111 1111 1111 1111 1111 1010, 十进制数为:4294967290
unsigned int a = -6;
int b = -20; // 将以补码的形式存于b对于的地址空间,b = 1111 1111 1111 1111 1111 1111 1110 1100, 十进制数为:4294967276
printf("unsigned int a = - 6 --> the value of a is %u\n", a);
printf("int b = - 20 --> the value of b transfered to \"unsigned int\" is %u\n", b);
if ( (a + b) > 0 ) // 取 a 的时候,将以 unsigned int 的类型读出,此时 a = 1111 1111 1111 1010,转换为十进制;
// 取b 的时候,由于存在隐式转换, b的补码, 将转换为 具体的数字
// 即是说 4294967290 + 4294967276, 注意此时将会越界,故输出为 4294967270
printf("TRUE, the value of (unsigned a) + (unsigned b) is %u\n", (a + b));
else
printf("FALSE, %u\n", (a + b));
// 隐式转换,加法结果为 4294967290 + 4294967276, 并存在越界,最终结果为 4294967270, 输出为 TRUE
((a + b) > 0) ? puts("TRUE") : puts("FALSE");
// 读取 a 时,将会以int 型读取,而a 本身存储的就是 -6 的补码,故读取出来就是 -6, 输出为 FALSE
(((int)a + b) > 0) ? puts("TRUE") : puts("FALSE");
printf("TRUE, the value of (unsigned a) + (unsigned b) is %d\n", ((int)a + b)); // 此时,输出结果为 -26
return 0;
}
运行结果如下: