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