五、数据类型(2):整数

1、C语言有哪些基础数据类型,sizeof可以做什么?

C是有类型的语言

——C语言的变量,必须:

(1)在使用前定义,并且必须确定类型。

——C以后的语言向两个方向发展:

(1)C++/Java更强调类型,对类型的检查更严格。

(2)JavaScript、Python、PHP不看重类型,甚至不需要事先定义。

类型安全

——支持强类型的观点认为明确的类型有助于尽早发现程序中的简单错误。

——反对强类型的观点认为过于强调类型迫使程序员面对底层、实现而非事务逻辑。

——总的来说,早期语言强调类型,面向低层的语言强调类型。

——C语言需要类型,但是对类型的安全检查并不足够。

C语言的类型

——整数

charshortintlong 
//long long 是C99的类型

——浮点数

floatdouble
//long double 是C99的类型

——逻辑

bool

——指针

——自定义类型

类型有何不同

——类型名称

intlongdouble

——输入输出时的格式化

%d 、 %ld  、  %lf

——所表达的数的范围

char<short<int<float<double

——内存中所占据的大小:一个字节到16个字节

——内存中的表达形式:二进制(补码)、编码

sizeof

——是一个运算符,给出某个类型或变量在内存中所占据的字节数

sizeof(int)
sizeof(i)

——是静态运算符,它的结果在编译时刻就决定了

——不要在sizeof的括号里做运算,这些运算不会做的

2、除了int,还有多少整数类型?

char: 1字节(8比特)
short: 2字节
int: 取决于编译器(CPU),通常的意义是“1个字”
long:4字节
long long : 8字节

3、整数内部:整数如何表达?尤其是负数?

计算机内部一切都是二进制。

如何表示负数?

——十进制用'-'来表示负数。

二进制负数

——一个字节可以表达的数:00000000——11111111(0-255)

——三种方案:

(1)仿照十进制,有一个特殊的标志表示负数。

(2)取中间的数为0,如1 000 000 表示0,比它小的是负数,比它大的是正数。

(3)补码。

补码

补码的意义就是拿补码和原码可以加出一个溢出的“零”

——考虑-1,我们希望-1+1 ——> 0。如何做到

 

数的范围

——对于一个字节(8位),可以表达的是:

(1)000 000 00 - 111 111 11

——其中

(1)000 000 00 ——> 0

(2)111 111 11 ~ 100 000 00   ——> -1 ~ -128

(3)000 000 01 ~ 011 111 11   ——> 1  ~ 127

4、整数的范围:如何推算整数类型所能表达的数的范围?越界了会怎样?

char: 1字节(8比特)      -128 ~ 127
short: 2字节             -32768 ~ 32767
int: 取决于编译器(CPU),通常的意义是“1个字”
long: 4字节
long long : 8字节
unsigned

——在整数类型前加上unsigned使得它们成为无符号的整数。

——内部的二进制表达没变,变的是如何看待它们

(1)如何输出?

——111 111 11

(1)对于char,是-1。

(2)对于unsigned char ,是255。

——如果一个字面量常数想要表达自己是unsigned,可以在后面加u或者U

255U

——用l或L表示long(long)

unsigned的初衷并非是扩展数能表达的范围,而是为了做纯二进制运算,主要是为了移位

整数越界

——整数是以纯二进制方式进行计算的,所以:

(1)111 111 11  + 1    ——>  100 000 000  ——> 0

(2)011 111 11  + 1    ——>  100 000 00    ——>-128

(3)100 000 00  - 1    ——>   011 111 11    ——>127

5、整数的格式化:如何格式化输出输入整数?如何处理8进制和16进制?

整数的输入输出

——只有两种形式:int 或 long long4

(1)%d 

int

(2)%u

unsigned

(3)%ld

long long

(4)%lu

unsigned long long
8进制和16进制

(1)一个以0开始的数字字面量是8进制

(2)一个以0x开始的数字字面量是16进制

(3)%O 用于8进制, %X 用于16进制

8进制和16进制只是如何把数字表达为字符串,与内部如何表达数字无关

——16进制很适合表达二进制数据,因为4位二进制正好是一个16进制位

——8进制的一位数字正好表达3位二进制

因为早期计算机的字长是12的倍数,而非8

6、选择整数类型:没什么特殊需要就用int好了

为什么整数要有那么多种?

为了准确表达内存,做底层程序的需要。

没有特殊的需要,就选择int

(1)现在的CPU的字长普遍是32位或64位,一次内存读写就是一个int,一次计算也是一个int,选择更短的类型不会更快,甚至可能更慢。

(2)现代的编译器一般会设计内存对齐,所以更短的类型实际在内存中有可能也占据一个int的大小(虽然sizeof告诉你更小)

unsigned与否只是输出的不同,内部计算是一样的。
原文地址:https://www.cnblogs.com/Strugglinggirl/p/9033529.html