整形转换和sizeof

 对于char类型的变量 , unsigned char :0~255; signed char :-128~127;

unsigned int m;
// 对于无符号数m来说,m >= 0 始终成立,所以该循环是一个死循环
for (m = 0; m >= 0; m++)
{
    printf("%u\n", m);
}
char arr[1000];
for (int i = 0; i < 1000; i++)
{
    arr[i] = -1 - n;   
}
// 对arr进行初始化:-1  -2  -3  ...... -1000
// 但是由于数组arr中每个元素都是char类型的,而char的范围是-128~127,所以会将后面的数字进行转化
// 所以数组arr实际上被初始化为:-1 -2     -127 -128 127 126     2 1 0 
printf("%d\n", strlen(arr)); // 255

整型提升问题:

unsigned char a = 200; // 1100 1000 
unsigned char b = 100; // 0110 0100
unsigned char c = 0;
c = a + b; 
// 两个char类型的数据无法直接进行相加,需要整型提升
// a -> 00000000 00000000 00000000 11001000
// b -> 00000000 00000000 00000000 01100100
// a+b  00000000 00000000 00000001 00101100  -> 300
// a+b 存储在char类型中 -> 00101100
// 后以整数的形式输出c -> 00000000 00000000 00000000 00101100 -> 44
printf("%d %d\n", a+b, c); // 300 44
// -1 -> 10000000 00000000 00000000 00000001 -> 11111111 11111111 11111111 11111111
// 由于a、b、c都是char类型的,所以 11111111
char a = -1;
unsigned char b = -1;
signed char c = -1;
// 在输出时,发生整型提升
// 对于a、c来说,都是有符号的,11111111 -> 11111111 11111111 11111111 11111111 -> -1
// 对于b来说,都是无符号的,11111111 -> 00000000 00000000 00000000 11111111 -> 255
printf("%d %d %d", a, b, c);

char d = -128;
// 10000000 00000000 00000000 10000000 -> 11111111 11111111 11111111 10000000 -> 10000000
char e = 128;
// 00000000 00000000 00000000 10000000 -> 10000000
// 由于char默认是有符号的,所以整型提升后:11111111 11111111 11111111 10000000
// 打印时,默认是无符号的,所以原码=补码,11111111 11111111 11111111 10000000  -> 4294967168
printf("%u\n", d); 
printf("%u\n", e);

sizeof :计算元素所占用的内存;

对于数组来说,数组名表示数组首元素的地址,有两种情况例外

        1.sizeof(数组名),数组名表示整个数组;计算的是整个数组占用的内存空间的大小

        2.&数组名,数组名表示整个数组,虽然输出的是首地址,但是取出的是整个数组的地址

// 对于整形数组
int a[] = { 1, 2, 3, 4, 5, 6 };
printf("%d\n", sizeof(a)); // 24
​printf("%d\n", sizeof(a + 1)); // 8
printf("%d\n", sizeof(&a + 1)); // 8
// a+1:表示首元素之后的元素地址;&a+1:表示整个数组之后的地址
// 地址所占的内存在64位平台上就是8byte
printf("%d\n", sizeof(*&a); // 24
// 对于二维数组
int arr[3][3] = { 0 };
// 二维数组可以看成由n个一维数组组成,数组民分别是arr[0]、arr[1]、....arr[n-1]
// 二维数组的数组名表示的是整个第一行的元素,除了sizeof(数组名)、&数组名
printf("%d\n", sizeof(arr));// 3*3*4=36
printf("%d\n", sizeof(*arr));// *arr -> 第一行的元素 3*4=12
printf("%d\n", sizeof(arr+1)); // 跳过首元素,表示第二行元素的地址 -- 8
// arr[0]就是二维数组中第一行元素组成的一维数组的数组名
printf("%d\n", sizeof(arr[0])); // 3*4=12
printf("%d\n", sizeof(arr[0]+1)); // 跳过首元素,表示第一行中第二个元素的地址 -- 8
printf("%d\n", sizeof(&arr[0]+1)); // 跳过整个第一行的元素,表示第二行的元素地址 -- 8 
// 由于sizeof后面的表达式不会参与实际的运算,所以实际有无并没有关系,只看元素的数据类型
printf("%d\n", sizeof(arr[3])); // arr3表示整个第四行的元素,与前三行相同,3*4 = 12
// 对于字符数组
// sizeof -- 计算所占的空间的大小; strlen -- 计算字符串的长度,从起始位置到'\0'结束,不算'\0;
char arr1[] = { 'a', 'b', 'c', 'd' }; // 被初始化为'a' 'b' 'c' 'd'
printf("%d\n", sizeof(arr1)); // 4
printf("%d\n", strlen(arr1)); // 随机值1 -- 起始位置字符'a'
printf("%d\n", strlen(arr1+1)); // 随机值1 -4 -- 起始位置字符'd'的后面一个
char arr2[] = "abcd"; // 'a' 'b' 'c' 'd' '\0'
printf("%d\n", sizeof(arr2)); // 5 计算内存是会加上'\0'
printf("%d\n", strlen(arr2)); // 4 
const char* p = "abcd"; -- 常量字符串,p是指针变量,将字符'a'的地址赋给p
printf("%d\n", sizeof(p)); // 8 -- 计算指针所占的内存
printf("%d\n", sizeof(p[0])); // 1 -- p[0] == *(p+0) == 'a'
printf("%d\n", strlen(p)); // 4 -- 起始位置字符'a'
printf("%d\n", sizeof(&p)); // 随机值, -- 起始位置p的地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值