欢迎光临散文网 会员登陆 & 注册

C语言——整型相关

2023-04-01 00:13 作者:-盛开在遗忘之后  | 我要投稿

数据储存的基本概念




类型关键字与字节大小

#include <stdio.h>
int main()
{
   signed int iValue = 9;
   unsigned int uiValue = 9u;
   long int lValue = 9l;
   unsigned long int ulValue = 95ul;
   long long int llValue = 95ll;
   unsigned long long int ullValue = 95ull;
   short int sValue = 9;
   unsigned short int usValue = 9u;
   unsigned char ucValue = 48u;
   
   //结果是 4 4 4
   printf("signed int 的字节数为 : %d %d %d\n",sizeof(int),sizeof(iValue),sizeof(9));
   
   //结果是 4 4 4
   printf("unsigned int 的字节数为 : %d %d %d\n",sizeof(unsigned int),sizeof(uiValue),sizeof(9u));
   
   //结果是 4 4 4
   printf("long int 的字节数为 : %d %d %d\n",sizeof(long int),sizeof(lValue),sizeof(9l));
   
   //结果是 4 4 4
   printf("unsigned long int 的字节数为 : %d %d %d\n",sizeof(unsigned long int), sizeof(ulValue),sizeof(95ul));
   
   //结果为 8 8 8
   printf("long long int 的字节数为 : %d %d %d\n",sizeof(long long int),sizeof(llValue),sizeof(95ll));
   
   //结果为 8 8 8
   printf("unsigned long long int 的字节数为 : %d %d %d\n",sizeof(unsigned long long int), sizeof(ullValue),sizeof(95ull));
   
   //结果为 2 2 4 ,没有 s 这个后缀,所以 9 最小需要 4 字节的存储空间
   printf("short int 的字节数为 : %d %d %d\n",sizeof(short int),sizeof(sValue),sizeof(9));
   
   //结果为 2 2 4
   printf("unsigned short int 的字节数为 : %d %d %d\n",sizeof(unsigned short int), sizeof(usValue),sizeof(9u));
   
   return 0;
}

  • sizof() 不是函数,而是长度运算符。括号里可以填 数据类型、变量、常量

  • 整型常量无后缀时,默认是 int 类型的存储方式。

  • 在常数后加上不同的后缀,计算机在存储时使用的空间大小也不一样。




字面值及前后缀

  • 字面值:即常量,指在程序中无需变量保存,可直接表示为一个具体的数字或字符串的值。

  • 前缀:0x 或 0X 表示十六进制,0 表示八进制, 不带前缀则默认表示十进制。

  • 后缀:整数常量也可以带一个后缀,后缀是 u 和 l 的组合,u 表示无符号整数(unsigned),l 表示长整数(long)。后缀可以是大写,也可以是小写,u 和 l 的顺序任意,但是后缀不可以重复。




进制转换

十进制转二进制

  • 整数部分:除 2 取余

  • 小数部分:乘 2 取整

  • 顺序是离小数点越来越远。



存储原理

原码、反码、补码的转换规则:

  • 对于正数:原码 = 反码 = 补码

  • 对于负数:原码符号位不变,其余位取反后变为反码。反码再加 1 变为补码。(1000 0000 的补码还是 1000 0000)


计算机内部是没有减法计算的,只有加法计算:





溢出现象

int i = -1; i 在内存中以补码形式存放为 ff ff ff ff这个补码对于 signed 和 unsigned 来说有什么不同呢?对于有符号整型来说 ff ff ff ff 表示 -1,而对于无符号整型来说,ff ff ff ff 表示该类型最大的数)。(unsigned int a = -1; 这个操作是什么意思?合法吗?是合法的,变量 a 首先在栈区被创建,而 -1 是被存储在常数区,代码中所有出现的常数都会被保存在常数区,-1 是一个负数,在常数区中以补码形式存储为 ff ff ff ff,a 在内存中的值不是 -1,而是 4294967295)


总结:当给一个整型变量存上 -1 的时候,系统会现在常量区创建 -1,然后系统会在栈区给变量分配一块空间,最后将常数区的补码复制一份给栈区的变量。这个过程就是赋值。


unsigned char c = -1;
unsigned short b = -1;
unsigned int a = -1;
unsigned long long d = -1;

//a 在内存中为 ff ff ff ff,%d 表示以有符号形式打印,这时候补码第一位就会被当成符号位,结果为 -1;而 %u 表示以有符号形式打印,补码第一位就不会被当成符号位了,结果为 4294967295
printf("%d\n",a);

//结果为 4294967295 2147483647 -2147483648,这就是溢出现象
printf("%u %d %d\n",a,a/2,a/2+1);

//结果为 255 127 -128
printf("%u %d %d\n",c,c/2,c/2+1);

以上代码中变量 c 为例来解释一下溢出现象:变量 c 在内存中以补码形式存储为 1111 1111,以 %u 的形式打印为 255。c/2 后变为 0111 1111,以 %d 的形式打印为 127。c/2-1 后变为 1000 0000,以 %d 的形式打印为 -128。





左值与右值

C/C++语言中可以放在赋值符号左边的是变量,即具有对应的可以由用户访问的存储单元,并且能够由用户去改变其值的量。

左值表示存储在计算机内存的对象,而不是常量或计算的结果。或者说左值是代表一个内存地址值,并且通过这个内存地址,就可以对内存进行读并且写(主要是能写)操作;这也就是为什么左值可以被赋值的原因了。

相对应的还有右值:当一个符号或者常量放在操作符右边的时候,计算机就读取他们的“右值”,也就是其代表的真实值。简单来说就是,左值相当于地址值,右值相当于数据值。右值指的是引用了一个存储在某个内存地址里的数据

//下面的代码是错误的,因为 8 和 9 都存储在变量区,不可以修改

8 = 9;


C语言——整型相关的评论 (共 条)

分享到微博请遵守国家法律