目前绝大多数编译器,int 型数据占 4 字节, char 型占 1 字节。进行不同数据的强制转换其实就是数据占用字节扩充或者截断。
比如
int a;
char b;
a=(int)b;
b=(char)a;
由 b 转换成 int 型数据就是将 b 扩充 3 个字节;而将 a 转换成 char 型数据就是将 a 的最低位字节截取出来。因此,将数据由值域较宽类型强制转换到值域较窄类型时,有可能出现数据信息丢失。
char 型数据在机器里通过 ASCII 码存储,也就是用一个整数存储的。譬如字符 ’ 0 ‘,对应的 ASCII 码的十进制数 是 48,因此强制转换成 int 后,是 48,而不是 0 .
字符’ ‘(空格)的ASCII码为32.
字符’A’的ASCII码为65,然后是’B’ ‘C’ … ‘Z’
字符’a’的ASCII码为97,然后是’b’ ‘c’ … ‘z’
字符’0’的ASCII码为48,然后是’1’ ‘2’ ‘3’ … ‘9’
所以,要想把一个数字字符ch,转为一个整数,就是ch-‘0’当然ch-48也行
例如把’3’转换为3,就是’3’-‘0’
因为C和C++中,字符和整型是一样的,可以隐式转换。
int a=257 char b=127 b=a 打印结果为什么是b=1?
原因是一个整数占4个字节,一个char只占一个字节,当int转char时,会选择int的最低位开始截取一个字节来付给char,而现在257在内存中为10000000 00000000 00000001 00000001把最后的00000001付给了char所以就是1。
1字节(Byte) = 8二进制位=8bits
字节(Byte)是通过网络传输信息(或在硬盘或内存中存储信息)的单位。
字节是计算机信息技术用于计量存储容量和传输容量的一种计量单位,1个字节等于8位二进制。
在ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。
英文标点占一个字节,中文标点占两个字节。
例子:
int a=0x111191191;
char b;
b=a;
则b的值为多少?
程序:
#include<stdio.h>
int main(){
int a=0x111191191;
char b;
b=a;
printf("%x\n",b);
return 0;
}
结果:
ffffff91
将程序修改为:
#include<stdio.h>
intmain(){
int a=0x111191191;
unsigned char b;
b=a;
printf("%x\n",b);
return 0;
}
结果:
91
上边两例都是从大的向小的的转型,则利用字节截断。小的向大的呢?与上边类似,再举一例。
程序:
#include<stdio.h>
intmain(){
int a;
char b=0x91;
a=b;
printf("%x\n",a);
return 0;
}
结果:
ffffff91
这种问题分析的关键是:
1、这种数据的有效位是多少位?
2、等号左边的数值只会在等号右边的数值中取自己的有效位数(char就只取右边数据的低八位)。