1、C语言 “=” 左边代表地址, “=”右边代表的是数值
例如 a = 100 ,左边的 “a” 就是代表 “a” 的地址,也就是数据存放的位置
右边的 “100” 代表的是数值,
整句话的话就是将 “100” 写入到 a 的地址中保存起来
2、在C语言中常有的数据的长度有如下
char a ; // 8bits
short c; //16bits
int c; //32bits
但是标准的C的赋值规则:
①长字节 >> 短字节
高位的字节直接抛弃,低位的字节保留
②短字节 >> 长字节
低位直接拷贝,高位补上符号位
有符号数,高位全部都补符号位
无符号数,高位全部都补0
练习
(1)分析如下程序的输出结果,假设32bits,
char c = 250;
printf("%d\n , c") ① = ???
printf("%u\n , c") ② = 250
unsigned char c = 250;
printf("%d\n , c") ③ = 250
printf("%u\n , c") ④ = 250
个人小结:(1)“%d” 是将数值看做无符号的数, “%u” 是将数值看做有符号的数
(2)①②中的 char 是 8bits ,最大的时候是256 ,看做有符号的时候是 -127~127
(2)分析如下程序的输出结果,假设32bits
#include <studio.h>
int mian()
{
printf ("%d\n",-1);//(1) -1
printf ("%u\n",-1);//(2) 2^32-1
printf ("%d\n",(char)-1);//(3) -1
printf ("%u\n",(char)-1);//(4) 2^32-1
printf ("%d\n",(unsigner char)-1);//(5) 1
printf ("%u\n",(unsigner char)-1);//(6) 1
printf ("%d\n",255);//(7) -1
printf ("%u\n",255);//(8) 2^32-1
printf ("%d\n",(char)255);//(9) -1
printf ("%u\n",(char)255);//(10) 255
printf ("%d\n",(unsigner char)255);//(11) -1
printf ("%u\n",(unsigner char)255);//(12) 2^32-1
}
在计算机C语言里面,存储 “-1” 的 8bits 为 (1111 1111)
原理如下:设(1111 1111)为原码,如果要反推十进制,需要先做一下处理
①先判断:当最高位为0时,表示正数,正数的原码 = 反码 = 补码
当最高位为1时,表示负数,负数的原码取反 = 反码,反码加一 = 补码,补码也就是这 个负数的绝对值。
判断最高位为1,所以为负数,取反为(0000 0000)= 反码,反码加一(0000 0001)= 补码,读出补码可以知道十进制是 1 ,这里的 1 就是这个负数的绝对值。
解题思维(自己存在疑问的点):
(2)因为 “-1” 在计算机里面存储的 8bits 为 (1111 1111),但是这里作为 32 位的计算机,“-1” 为 “int” 形,所以这里需要进行一个 短字节>>长字节 的过程,在这里事,“-1” 是有符号的数,所以高位全部补上 “1” ,为(11111111 11111111 11111111 11111111),当作为 “%u” 输出的时候(无符号形),所以为 “2^32-1” 。