69,337
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
void main()
{
unsigned int a=-2;
printf("a=%ud\n",a);//负数以%u输出
printf("mem:a=%xH\n\n",a&0xFFFFFFFF);//a的内存数据
int b=-2;
printf("b=%d\n",b);//负数以%d输出
printf("mem:b=%xH\n\n",b&0xFFFFFFFF);//b的内存数据
int c=2;
printf("c=%d\n",c);//正数以%u%d输出的结果一样
printf("c=%u\n",c);
printf("men:c=%xH\n",c&0xFFFFFFFF);//c的内存数据
}
//VC中用的是4个字节存储int
//内存的数据以反码规则存储
//这里的问题在用法上关键是printf函数的输出格式;
//对于负数或最高位为1的正数,既符号为为1(表示负数),%d输出负数,%u输出正数;
//对于最高二进制位即符号位为0的正数,%d %u输出相同的结果;
float sum(float a[], unsigned len)
{
int i;
float res = 0f;
for (i = 0; i <= len - 1; i++)
res += a[i];
return res;
}
假设int为2字节,当len为零时,这段代码应该返回0.0;实际上len - 1等于-1会转变成无符号数也就是65535,循环得以继续,程序会遇到存储器错误。
1. int x = -1;
2. unsigned ux = (unsigned) x;