char a和signed char b都是相同定义,都代表有符号数,打印结果为-1,但c定义为unsigned char类型,表示无符号数,其在内存中表示为0000 0000 0000 0000 0000 0000 1111 1111(32位),低八位1111 1111表示 char类型的-1,占1个字节,由于其为无符号数据,系统将1111 1111中的最高位1看为数据,在其前面补0,最后输出0000 0000 0000 0000 0000 0000 1111 1111为255
char类型数据范围为-128~127,-128在内存中存储为1000 0000,打印格式为%u是十进制无符号整数,将-128在内存中扩展为32位为1111 1111 1111 1111 1111 1111 1000 0000(补码形式),将其输出为十进制,结果为 4,294,967,168
128在内存中为1000 0000,打印其无符号十进制整数,与2相同,为4,294,967,168
-20补码为1111 1111 1111 1111 1111 1111 1110 1100,10的补码为0000 0000 0000 0000 0000 0000 0000 1010,两数相加为1111 1111 1111 1111 1111 1111 1111 0110,因为其打印为%d是有符号整数,所以最高位1表示符号位为负数,将其转换为原码为1000 0000 0000 0000 0000 0000 0000 1010,结果为-10
出现死循环, 定义无符号整形i,其值一直大于等于0,所以陷入死循环
i为无符号数据,其范围为0-255,所以会陷入死循环
大端小端模式介绍
什么是大端小端:
大端模式,是指数据的低位保存在内存中的高地址,而数据的高位保存在内存的低地址中
小端模式,是指数据的高位保存在内存中的低地址,而数据的低位保存在内存的高地址中
此系统用小端存储,变量a 值为10,十六进制表示为00 00 00 0a,在小端模式下,其在内存中存储为0a 00 00 00
请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序
本题是为判断程序运行的电脑是大端存储模式还是小端存储模式,解法如下:
解法1:
定义i变量赋值为1,将其强转为char类型,只有一个字节,1的二进制形式为0000 0000 0000 0000 0000 0000 0000 0001,将其转为char 类型值只有俩种可能,0和1,当输出为1 的时候说明0000 0001 在内存的低地址中,为小端模式,否则为大端模式
#include <stdio.h>
int check_sys()
{
int i = 1;//0000 0000 0000 0000 0000 0000 0000 0001
return *(char*)&i;
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小端\n");
}
else {
printf("大端\n");
}
return 0;
}
解法2:
使用联合体union,就是一个多个变量的结构体同时使用一块内存区域,区域的取值大小为该结构体中长度最大的变量的值
在内存中1的存储为00 00 00 01(16进制,大端)或者01 00 00 00(16进制,小端),un.ch表示内存中低地址的数据,即00或者01,如果结果是1,即为小端,否则为大端
#include<stdio.h>
int check_sys()
{
union {
int i;
char ch;
}un;
un.i = 1;
return un.ch;
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小端\n");
}
else {
printf("大端\n");
}
return 0;
}
最后,在平时做题是一定要仔细,对整形数据在内存中的存储要注意分析