1.整数的范围:
类型 | 范围 |
---|---|
char | 1字节:-128~127 |
short | 2字节:-32768~32767 |
int | 取决于编译器(CPU),通常的意义是“1个字” |
long | 4字节:-2147483648~2147483647 |
long long | 8字节:-9223372036854775808 ~ 9223372036854775807 |
2.unsigned
如果一个字面量常数想要表达自己是unsigned,可以在后面加u或U。如255U
用l或L表示long(long)
unsigned的初衷并非扩展数能表达的范围,而是为了做纯二进制运算,主要是为了移位。
例如:
#include "stdio.h"
#define b 'A'
#define b2 65 //两种使用define定义字符型常量的方法。
int main()
{
unsigned const char a=255; //unsigned类型常数,类型为char,起到的作用是
//限制常量长度为一个字节。
const char a2=255;//普通常量,类型也是char,在内存中占一个字节。
char d=255;//char类型变量,给它赋值为255
int i=a;//使用常量a给int变量i赋值
printf("a=%d\n",a);//将a的数据转换为整型输出
printf("a2=%d\n",a2);//将a2的数据转换为整型输出
printf("i=%d\n",i);//输出i的值
printf("b=%c\n",b);//将b的数据以字符型输出
printf("b2=%c\n",b2);//将b2的数据以字符型输出
printf("d=%c\n",d);//将d的数据以字符型输出
d=25;
printf("d=%c",d);//将d的值变为25后以字符型输出
return 0;
}
输出结果为:
可见在常数中,加unsigned和不加会影响其转换为整数输出时的结果,而若以字符形式输出,则其内存内的二进制数必须满足其值在ASII码区间内,否则无意义。
不,也不能说毫无意义,对于ASII码来说,标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符 。
其中:0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响 。
后128个称为扩展ASCII码。许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。
在英语中,用128个符号编码便可以表示所有,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用 ASCII 码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。
但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0–127表示的符号是一样的,不一样的只是128–255的这一段 。
至于在本机的127之后的ASII码,以字符形式输出,经试验只有128有特殊字符,其他不是“"?”就是输出为空(或者实际上有其他东西但根本不现实,只占据了大概两个空格的空间)。