第三章
位、字节、字
位(bit):最小的存储单元
字节(byte):常用的计算机存储单位,1字节=8位。
字(word)是设计计算机时给定的自然存储单位。计算机的字长越大,其数据转移越快,允许的内存访问也更多。
整数
十进制、八进制或十六进制
0前缀表示八进制数,0x或0X前缀表示十六进制数。
例如:32、040、0x20分别是十进制、八进制、十六进制。
l或L表明该值是long类型,ll或LLi前缀表明该值是 long long类型。
十进制显示数字,使用**%d**;以八进制显示数字,使用**%o**;以十六进制显示数字,使用**%x**
注意,如果要在八进制和十六进制值前显示0和0x前缀,要分别在转换说明中加入**#。%#o,%#x。**
无符号整数和有符号整数
首先了解 原码,反码,补码,移码的概念,在看无符号整数和有符号整数。
此处详细解释:https://blog.csdn.net/cai88453626/article/details/127221254
溢出
/*超出系统允许的最大值*/
#include <stdio.h>
int main(void)
{
int i = 2147483647;
unsigned int j = 4294967295;
printf("%d %d %d\n", i, i+1, i+2);
printf("%u %u %u\n", j, j+1, j+2);
return 0;
}
有符号整数超出正数(负数)最大值时,从负数(正数)最大值开始。
无符号整数超出最大值时,从0开始。
原理:
有符号整数超出正数最大值时,符号位变成1,所以变成负数的最大值。
有符号整数超出负数的最大时,是什么原理?以及无符号整数超出最大值,为什么从0开始算起。
浮点数
浮点数分为小数部分和指数部分来表示,分开储存这两部分。
溢出
上溢:当计算导致数字过大,超过当前类型能表达的范围
下溢:
现在,C库已提供了用于检查计算是否会产生低于正常值的函数
浮点数舍入错误
给定一个数,加上1,再减去原来给定的数,结果是多少?
/* floaterr.c--演示舍入错误 */
#include <stdio.h>
int main(void)
{
float a,b;
b = 2.0e20 + 1.0;
a = b - 2.0e20;
printf("%f \n", a);
return 0;
}
原因:计算机缺少足够的小数位来完成正确的运算。
类型大小
sizeof() sizeof是C语言的内置运算符,以字节为单位给出指定类型的大小。
C99为类型大小提供%zd转换说明
C语言中自动类型转换
1、将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换
float f = 100;
int n = f;
2、在不同的类型的混合运算,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种类型,然后在计算
转换规则:
复习题
使用哪些可以移植的数据类型可以获得32位有符号整数?选择的理由是什么?
如果要正好获得32位的整数,可以使用int32_t类型。要获得可储存至少32位位整数的最小类型,可以使用int_least32_t类型。如果要为32位整数提供最快的计算速度,可以选择int_fast32_t类型(假设你的系统已定义了上述类型)。
/*altnames.c--可移植整数类型名*/
#if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
# define CONFIG_WIN32
#endif
#if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(EMULATE_INTTYPES)
# define EMULATE_INTTYPES
#endif
#ifndef EMULATE_INTTYPES
# include <inttypes.h>
#else
typedef signed char int8_t;
typedef signed short int16_t;
typedef signed int int32_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
# ifdef CONFIG_WIN32
typedef signed __int64 int64_t;
typedef unsigned __int64 uint64_t;
# else /* other OS */
typedef signed long long int64_t;
typedef unsigned long long uint64_t;
# endif /* other OS */
#endif /* EMULATE_INTTYPES */
#include <stdio.h>
//#include <inttype.h> //支持可移植类型
int main(void)
{
int32_t me32; //me32是一个32位有符号整型变量
me32 = 45933945;
printf("First, assume int32_t is int: ");
printf("me32 = %d\n, me32");
printf("Next,let's not make any assumeptions.\n");
printf("Instead,use a \"macro\" from inttype.h: ");
printf("me32 = %" PRId32 "\n",me32);
return 0;
}