将一个unsigned型数据赋给一个占据同样长度存储单元的整型变量时(如:unsigned→int、unsigned long→long,unsigned short→short) ,原值照赋,内部的存储方式不变,但外部值却可能改变
用强制类型转换是一个好习惯,这样,至少从程序上可以看出想干什么。
四、指针变量强转规则:
(1)指针变量强转,改变了指针取址能力。
(2)一个指针涉及2个变量:一个是指针变量自己本身,一个是指针变量指向的那个变量
(3)int p;定义指针变量时,p(指针变量本身)是int 类型,*p(指针指向的那个变量)是int类型的。
(4)int 类型说白了就是指针类型,只要是指针类型就都是占4字节,解析方式都是按照地址的方式来解析(意思是里面存的32个二进制加起来表示一个内存地址)的。结论就是:所有的指针类型(不管是int 还是char * 还是double *)的解析方式是相同的,都是地址。
(5)对于指针所指向的那个变量来说,指针的类型就很重要了。指针所指向的那个变量的类型(它所对应的内存空间的解析方法)要取决于指针类型。譬如指针是int *的,那么指针所指向的变量就是int类型的。
#include
int main(void)
{
int a[3] = {0x11223344, 0x55667788, 0};
int *p1 = a;
printf("*p1 = 0x%x\n", *p1); //*p1 = 0x11223344
char *p2 = (char *)a; //改变取址能力
printf("*p2 = 0x%x\n", *p2); //*p2 = 0x44
printf("*p2 = 0x%x\n", *(p2+1)); //*p2 = 0x33
printf("*p2 = 0x%x\n", *(p2+2)); //*p2 = 0x22
printf("*p2 = 0x%x\n", *(p2+3)); //*p2 = 0x11
printf("*p2 = 0x%x\n", *(p2+4)); //*p2 = 0xffffff88 ?
printf("*p2 = 0x%x\n", *(p2+5)); //*p2 = 0x77
return 0;
}