signed、unsigned 关键字补充内容
关于大端和小端
我们通过在内存中存储一个值,
用于观察数据在内存中的存储形式。
如下:
例:
字符 a
十进制:-10(所以用十进制打印的结果)
原码:10000000 00000000 00000000 00001010
反码:11111111 11111111 11111111 11110101
补码:11111111 11111111 11111111 11110110(存入内存)
十六进制:ff ff ff f6(在内存中显示的结果)
通过调试观察:
而在内存中存储的却是:f6 ff ff ff
因为我们VS2019的环境是小端存储。
存储方式如下图:
大小端存储数据方式
数据是按照字节为单位存储的,
int 类型是四个字节。
每个字节都有地址,而地址有高地址和低地址之分。
直接说结论:
1.大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
2.小端模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
所以我们观察到的数据就是以字节为单位反着存储。
再举一个小端存储的例子:
这就是小端存储的形式。
总结:
大端存储其实就是正着存,小端则是反着存。
那我们该如何判断呢?
判断大小端
例:
#include int main() { int a = 1; char* pa = (char*)&a; if (*pa == 1)//通过观察内存中第一个字节是否为1 { //从而判断大小端 printf("小端\n"); } else { printf("大端\n"); } return 0; }
输出:
输出:小端
深入理解数据存储
关于 char 类型的取值范围:
char 是八个比特位,一个符号位,剩下七个数值位。
也就是最小是-127,
最大是127。
但是,
00 00 00 00 与 10 00 00 00
这两组数,00 00 00 00 已经表示0了,那另外一组数据该如何表示?
它表示:-128
所以char 类型的大小是:[ -128 ~ 127 ]。
练习:
#include int main() { char a[1000]; int i; for (i = 0; i < 1000; i++) { a[i] = -1 - i;//从-1、-2...-128一直遍历到127,然后再加一等于0 } //所以总共是128+127=255 //strlen遇到\0结束 printf("%d", strlen(a)); return 0; }
输出:
输出:255
写在最后:
以上就是本篇文章的内容了,感谢你的阅读。