C Primer Plus学习笔记 Chapter 3 基本数据类型

C Primer Plus 学习笔记 Chapter 3

让终端窗口不闪退

一般末尾return前加一个gatchar(),但是在如下情况:

/* platinum.c -- your weight in platinum */
#include <stdio.h>
int main(void)
{
float weight;
float value;
printf("Are you worth your weight in platinum?\n");
printf("Let's check it out.\n");
printf("Please enter your weight in pounds: ");
scanf("%f", &weight);
value = 1700.0 * weight * 14.5833;
printf("Your weight in platinum is worth $%.2f.\n", value);
printf("You are easily worth that! If platinum prices drop,\n");
printf("eat more to maintain your value.\n");
getchar();***// 一个getchar()仍然使终端直接关闭,第一个getchar()收到的是用户键入的回车***
getchar();***//两个getchar()可以使其等待***
return 0;
}

一个getchar()仍然使终端直接关闭,第一个getchar()收到的是用户键入的回车,第二个getchar()才等待用户键入,不闪退。

或者末尾加system(“pause”) 或者return这行断点。

基本数据类型及其范围

整型

int:占2个字节或4个字节,范围 2个字节-32768 到32767 (2^15-1=32767)三开头5位,打印转换说明%d
4个字节 -2147483648到2147483647(2^31-1=2147483647)
二开头10位,%d
short:2个字节,范围-32768 到32767 %hd
long:4个字节 -2147483648到2147483647(2^31-1=2147483647)%ld
unsigned int: 2个字节,0到65535(2^16-1=65535) 六开头5位 %ud
4个字节,0到4294967295(2^32-1=)四开头10位 %ud
unsigned short:2个字节,0到65535(2^16-1=65535) 六开头5位 %hu
unsigned long:4个字节,0到4294967295(2^32-1=)四开头10位 %lu
long long: 64位8个字节,范围-9223372036854775808到 9223372036854775807(2^63-1=)九开头19位 %lld

另以十六进制打印 %x, %lx, %hx, 八进制%o,%lo, ho

关于有符号类型最小负数范围比最小正数范围多一:原码和反码存放数据,0有两个值,只有为补码存放时0唯一,此时
-1 = 1111111111111111
-2 = 1111111111111110
。。。。

-32768=1000000000000000(16位)

这是推算的结果,也可以说是规定的结果

如果一个数超出了int类型的取值范围,且在long类型的取值范围内时,使用long类型。然而,对于那些long占用的空间比int大的系统,使用long类型会减慢运算速度。因此,如非必要,请不要使用long类型。另外要注意一点:如果在long类型和int类型占用空间相同的机器上编写代码,当确实需要32位的整数时,应使用long类型而不是int类型,以便把程序移植到16位机后仍然可以正常工作。类似地,如果确实需要64位的整数,应使用long long类型。
要把一个较小的整型常量当作long来对待时,可以末尾加上L

_Bool,0或1
可移植类型 stdint.h和inttypes.h

整数溢出

/* toobig.c-- 超出系统允许的最大int值*/
#include <stdio.h>
int main(void)
{
    int i = 2147483647;
    short a = 32767;
    unsigned int j = 4294967295;
    printf("%d %d %d\n", i, i + 1, i + 2);
    printf("%u %u %u\n", j, j + 1, j + 2);
    printf("%hd %hd %hd %hd %hd %hd\n", a, a + 1, a+2, 65537,a+a,a+a+3);

    return 0;
}

输出`

2147483647 -2147483648 -2147483647
4294967295 0 1
32767 -32768 -32767 1 -2 1

char类型

用于存储字符,本质上存储整形数据(ASC码),8位1个字节
有的编译器视为有符号类型,则char表示范围-128~127 ;有的编译器视为无符号类型,char的范围为0~255
初始化方式 : 赋值字符或者ASC码值,而ASC码赋值可以由转义序列十六进制\0oo和八进制\xhh来表示,可以是1到3位八进制和十六进制。但最好使用字符赋值,‘A’比65好记,可移植性高。

char broiled; /* 声明一个char类型的变量 */
broiled = 'T'; /* 为其赋值,正确 */
char grade = 65; /* 对于ASCII,这样做没问题,但这是一种不好的编程
风格 */
char beep='\007'//其实可以省略前面的0,'\07'甚至'\7'都可以。即使没有前缀 0,编译器在处理这种写法时,仍会解释为八进制。
char Ctrl_P='\x010'//或者'\x10'

C语言将字符常量视为int类型而非char类型。例如,在int为
32位、char为8位的ASCII系统中,有下面的代码:
char grade = ‘B’;
本来’B’对应的数值66储存在32位的存储单元中,现在却可以储存在8位的存储单元中(grade)。利用字符常量的这种特性,可以定义一个字符常量’FATE’,即把4个独立的8位ASCII码储存在一个32位存储单元中。如果把这样的字符常量赋给char类型变量grade,只有最后8位有效。因此,grade的值是’E’。

浮点型:

有指数记数法:2.85e-6,打印%e 或者都用大写E
C99新加入p记数法(十六进制指数记数法):0xa.1fp10 = 10+1/16+15/256 打印%a或者都是大写A,%A
float:4字节,其中8位表示指数的值,24位存放尾数。至少表示6位有效数字,取值范围是10-37~10+37 打印%f
double:8字节,表示最小范围和float相同,但至少表示10位有效数字(标准),但一般要求13位有效数字。
打印long double要用%Lf,%La,%Le

复数和虚数类型

C语言有3种复数类型:float_Complex、double_Complex和
long double _Complex。例如,float _Complex类型的变量应包含两个float类型的值,分别表示复数的实部和虚部。
类似地, C语言的3种虚数类型是float_Imaginary、double _Imaginary和long double _Imaginary。
如果包含complex.h头文件,便可用complex代替_Complex,用imaginary代替_Imaginary,还可以用I代替-1的平方根。

sizeof

sizeof是c语言内置的运算符,以字节为单位给出指定类型的大小。C99和C11提供%zd转换说明匹配sizeof的返回类型,不支持C99和C11的编译器可以用%u或者%lu代替%zd
查看自己系统的指定类型大小

//* typesize.c -- 打印类型大小 */
#include <stdio.h>
int main(void)
{
/* C99为类型大小提供%zd转换说明 */
printf("Type short has a size of %zd bytes.\n", sizeof(short));
printf("Type int has a size of %zd bytes.\n", sizeof(int));
printf("Type char has a size of %zd bytes.\n", sizeof(char));
printf("Type long has a size of %zd bytes.\n", sizeof(long));
printf("Type long long has a size of %zd bytes.\n",
sizeof(long long));
printf("Type double has a size of %zd bytes.\n",
sizeof(double));
printf("Type long double has a size of %zd bytes.\n",
sizeof(long double));
return 0;
}

输出:
Type short has a size of 2 bytes. Type int has a size of 4 bytes. Type char has a size of 1 bytes. Type long has a size of 4 bytes. Type long long has a size of 8 bytes. Type double has a size of 8 bytes. Type long double has a size of 16 bytes.

其它

/* escape.c -- 使用转移序列 */
#include <stdio.h>
int main(void)
{
float salary;
printf("\aEnter your desired monthly salary:"); /* 1 */
printf(" $_______\b\b\b\b\b\b\b"); /* 2 */
scanf("%f", &salary);
printf("\n\t$%.2f a month is $%.2f a year.", salary,
salary * 12.0); /* 3 */
printf("\rGee!\n"); /* 4 */
return 0;
}

假设在系统中运行的转义序列行为与本章描述的行为一致(实际行为可
能不同。例如,XCode 4.6把\a、\b和\r显示为颠倒的问号),下面我们来分
析这个程序。
第1条printf()语句(注释中标为1)发出一声警报(因为使用了\a),然
后打印下面的内容:
Enter your desired monthly salary:
因为printf()中的字符串末尾没有\n,所以光标停留在冒号后面。
第2条printf()语句在光标处接着打印,屏幕上显示的内容是:
Enter your desired monthly salary: $_______
冒号和美元符号之间有一个空格,这是因为第2条printf()语句中的字符
串以一个空格开始。7个退格字符使得光标左移7个位置,即把光标移至7个下划线字符的前面,紧跟在美元符号后面。通常,退格不会擦除退回所经过的字符,但有些实现是擦除的,这和本例不同。
假设键入的数据是4000.00(并按下Enter键),屏幕显示的内容应该
是:
Enter your desired monthly salary: $4000.00
键入的字符替换了下划线字符。按下Enter键后,光标移至下一行的起
始处。

第3条printf()语句中的字符串以\n\t开始。换行字符使光标移至下一行起
始处。水平制表符使光标移至该行的下一个制表点,一般是第9列(但不一
定)。然后打印字符串中的其他内容。执行完该语句后,此时屏幕显示的内
容应该是:
162
Enter your desired monthly salary: $4000.00
$4000.00 a month is $48000.00 a year.
因为这条printf()语句中没有使用换行字符,所以光标停留在最后的点号后面。
第4条printf()语句以**\r开始。这使得光标回到当前行的起始处。**然后打印Gee!,接着\n使光标移至下一行的起始处。屏幕最后显示的内容应该是:
Enter your desired monthly salary: $4000.00
Gee! $4000.00 a month is $48000.00 a year

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值