2025年数据的存储

数据的存储整数在内存中以补码的形式存储 整数在内存中以补码的形式存储 整数的 2 进制表示也有三种表示形式 1 正的整数 原码 反码 补码相同 2 负的整数 原码 反码 补码是需要计算的 原码 直接通过正负的形式写出的二进制序列就是原码 反码 原码的符号位不变 其他位按位取反得到的就是反码 补码

大家好,我是讯享网,很高兴认识大家。

整数在内存中以补码的形式存储

整数在内存中以补码的形式存储

整数的2进制表示也有三种表示形式:
 1. 正的整数,原码、反码、补码相同
 2. 负的整数,原码、反码、补码是需要计算的
原码:直接通过正负的形式写出的二进制序列就是原码
反码:原码的符号位不变,其他位按位取反得到的就是反码
补码:反码+1就是补码
补码符号位不变,其他位按位取反得到的就是原码
整数内存中存放是补码的二进制序列

代码演示:

int main() {     int a = 20;     //20     //00000000000000000000000000010100     //0x00 00 00 14     //00000000000000000000000000010100     //00000000000000000000000000010100     //     int b = -10;     //000000000000000001010--原码     //0x80 00 00 0a     //--反码     //0xfffffff5     //--补码     //0xfffffff6     //     return 0;
讯享网

大小端字节序

在vs编译器下是小端字节序

测试代码:

讯享网int check_sys() { int a = 1; return *((char*)&a); } int main() { int a = 1; int ret = check_sys(); if (ret == 1) { printf("小端"); } else { printf("打端"); } return 0; }

无符号数在内存中的存储方式

整数存储在字符变量中,发生截断,以%d的形式打印,发生整形提升,高位补符号位。

无符号数发生整型提升时,高位直接补0(无符号数默认为正数)。

代码演示:

int main() { char a = -1; //000000000000000000001 // // //截断- //提升- //000000000000000000000 //000000000000000000001 signed char b = -1; unsigned char c = -1; //000000000000000000001 // // //截断- //提升-000000000000000000000000 printf("a=%d,b=%d,c=%d", a, b, c); return 0; }

无符号整形如何打印

以无符号整形打印,补码即为原码。

代码演示:

讯享网int main() { //char -128~127 char a = -128; //0000000000000 // // //截断- //提升- //提升看变量本身的类型,无符号为加0,有符号加符号位(第八位) // //00000000000000 //000000000000 printf("%u\n", a); printf("%d\n", a); //%u - 打印无符号整数 return 0; } 

整形和无符号整型相加

整形和无符号整型相加:

int main() { int i = -20; // - -20的补码 unsigned int j = 10; //00000000000000000000000000001010 - 补码 printf("%d\n", i + j); // //00000000000000000000000000001010 // - 补码 //000000000000000001001 //000000000000000001010 -> -10 return 0; } 

无符号数的特性

以下代码会打印多次,当i=-1时,-1会是无符号数,-1的补码极大,i减小时,i的补码会减小。

#include <windows.h> int main() { unsigned int i; for (i = 9; i >= 0; i--) { printf("%u\n", i); sleep(1000);//休眠1000毫秒 } //-1的补码000000000000000000001 //无符号数为2的32次方 return 0; }

char类型存储的范围

char类型的存储范围是-128到127,而strlen只在乎\0值之前出现多少字符。

int main() { char a[1000]; int i; for (i = 0; i < 1000; i++) { a[i] = -1 - i; } printf("%d", strlen(a)); //arr[i] --> char -128~127 //-1 -2 -3 -4 ... -1000 //-1 -2 ... -128 127 126 125 .. 3 2 1 0 -1 ... //128+127 = 255 //strlen 是求字符串的长度, //关注的是字符串中'\0'(数字0)之前出现多少字符 return 0; } 

无符号char类型存储的范围

以下代码陷入死循环,由于i为无符号字符类型,当i=256时截断为0

#include <stdio.h> unsigned char i = 0; //unsigned char 类型的取值范围是0~255 int main() { for (i = 0; i <= 255; i++) { printf("hello world\n"); } return 0; } //000000000000000000000000 //截断-00000000 

strlen的返回类型

以下代码如果不强制类型转换,输出为>,因为strlen的返回类型为size_t,-3的原码补码一致,为一个极大的数。

int main() { //int len = strlen("abcdef"); //printf("%d\n", len); //strlen的返回类型为size_t -> unsigned int if ((int)strlen("abc") - (int)strlen("abcdef") > 0) printf(">\n"); else printf("<\n"); return 0; } 

浮点型在内存中的存储

代码演示:

int main() { int n = 9; //00000000000000000000000000001001 //0 00000000 00000000000000000001001 //E=-126 //M=0.00000000000000000001001 //+0.00000000000000000001001*2^-126 // float* pFloat = (float*)&n; printf("n的值为:%d\n", n);//9 printf("*pFloat的值为:%f\n", *pFloat);//0.000000 *pFloat = 9.0; //1001.0 //S=0 E=3 M=1.001 //0  000000000000 printf("num的值为:%d\n", n);//000000000000000000000 printf("*pFloat的值为:%f\n", *pFloat);//9.0 return 0; }

小讯
上一篇 2025-02-25 18:29
下一篇 2025-03-18 09:06

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/45472.html