原码、反码、补码
原码:
概念:将一个数表示成二进制就是源码
比如:
反码:
概念: 原码的符号位不变,将其他位取反就得到反码
- 正数的原码、反码、补码都相同
比如:
补码
概念:将一个数的反码加一就是补码
比如:
整形提升和截断
整形提升:
概念: C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型
提升。有符号的整型提升:
规则:前面的位数补上符号位
比如:
无符号的整形提升:
规则:前面的位数补0
比如:
大、小端存储
来看一段代码:
int main() { int a = 10; return 0; }
我们已经知道10的二进制序列和16进制序列为:
在VS2022里调试并打开内存窗口:
可以看到我们对a取地址看到的内存和我们原先表示 的16进制序列不一样
那究竟是为什么呢?
小端存储
概念 :
小端存储是指在内存中一个数的低位存在内存的低地址处,高位存在高地址处,且以字节为单位。
啥意思?看图!!!
就拿10在内存中的存储来说(以下的地址都是假设的):
我们知道在内存中:一个字节分配一个内存地址
0a是一个字节,处于低位,被存到到0x10处。
然后是00,以此类推
在VS2022中是小端存储:
大端存储
概念:
大端存储指的是一个数在内存中低位存在高地址处,高位存在低地址处。
示例:
应用举例
应用一
以下代码输出什么?
#include <stdio.h>
int main()
{
char a= -1;
signed char b=-1;
unsigned char c=-1;
printf(“a=%d,b=%d,c=%d”,a,b,c);
return 0;
}a
char a = -1; 相当于signed char a = -1;
存-1时:
-1的补码
11111111 11111111 11111111 11111111
但是由于a是char类型会发生整形截断
所以最终存到a中为:
11111111
打印-1时:
会发生整形提升
所以-1在内存中的补码又变成:
11111111 11111111 11111111 11111111
但是这还是补码,还要转换成原码!!!
反码(补码-1):
11111111 11111111 11111111 11111110
原码(反码的符号位不变,其他位按位取反):
10000000 00000000 00000000 00000001
所以输出-1
b
a的情况和b一样
c
运行截图:
应用二
设计一个小程序来判断当前机器的字节序 。
思路:
1.定义一个变量存1
2.1表示成16进制为00 00 00 01
3.取出首地址的值
如果为1那么就是小端字节序
如果为0那么就是大端字节序
代码:
#include<stdio.h> int main() { int a = 1; char* p = (char*) & a; if (*p == 1) { printf("小端"); } else { printf("大端"); } return 0; }
VS2022下运行截图:
如果对你有帮助,不妨点个赞吧😄