杂谈c语言——5.类型提升

码码生的 2024-08-20 15:05:03 阅读 68

1.习题一

<code>#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;

}

结果为 -1 -1  255

(1)a:char(有符号

源码 :  10000000000000000000000000000001      (第一个1为符号位)

反码 :  1111111111111111111111111111111111110      (符号位不动,其他取反)

补码:   1111111111111111111111111111111111111       (反码+1)

因为char只能读取一个字节,即8个bit位

所以a存储   11111111

因为要打印%d(有符号整数)    所以需要整形提升(按照a的类型补数据,a为char,补符号位的‘1’,若为unsign char 则需要补‘0’

a:11111111111111111111111111111111

打印%d(有符号整数)所以a视为有符号数的补码;

源码为:  10000000000000000000000000000001

打印出来为-1;

(3)

a:unsigned char(无符号)

源码 :  10000000000000000000000000000001      (第一个1为符号位)

反码 :  1111111111111111111111111111111111110      (符号位不动,其他取反)

补码:   1111111111111111111111111111111111111       (反码+1)

因为char只能读取一个字节,即8个bit位

所以a存储   11111111   (注意第一个‘1”不是符号位,因为是unsigned char(无符号)

要打印%d(有符号整数)

补’0‘

00000000000000000000000011111111

打印%d(有符号整数)所以a视为无符号数的源码;

打印出来为255;

2.习题二

#include <stdio.h>

int main()

{

char a = -128;

printf("%u\n",a);

return 0;

} //代码1

#include <stdio.h>

int main()

{

char a = 128;

printf("%u\n",a);

return 0;

} //代码2

代码1:

 

a:char(有符号)

源码 :  10000000000000000000000010000000      (第一个1为符号位)

反码 :  1111111111111111111111111111011111111     (符号位不动,其他取反)

补码:   1111111111111111111111111111110000000       (反码+1)

因为char只能读取一个字节,即8个bit位

所以a存储   10000000

因为要打印%u(无符号整数)所以需要整形提升(按照a的类型补数据,a为char,补符号位的‘1’,若为unsign char 则需要补‘0’

11111111111111111111111110000000;

打印%u(无符号整数)所以a视为无符号数的源码;

打印出来为:4294967168

代码2:

源码 :  00000000000000000000000010000000      (正数源反补一致)

补码:   00000000000000000000000010000000 

因为char只能读取一个字节,即8个bit位

所以a存储   10000000

因为要打印%u(无符号整数)所以需要整形提升(按照a的类型补数据,a为char,补符号位的‘1’,若为unsign char 则需要补‘0’

11111111111111111111111110000000;

打印%u(无符号整数)所以a视为无符号数的源码;

打印出来为:4294967168

3.习题三 

 

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<iostream>

using namespace std;

int main()

{

size_t a = 0; 相当于unsigned int

int b = 2;

while (b >= a)

{

cout << b << endl;

b--;

}

return 0;

}

注意   在操作符的两边,若变量类型不一致,也会发生类型提升

第一次循环,b被类型提升为size_t,(x64下8个字节,x32下4个字节)

 注意:当b经历几轮循环后变成-1时

源码 :  10000000000000000000000000000001      (第一个1为符号位)

反码 :  1111111111111111111111111111111111110      (符号位不动,其他取反)

补码:   1111111111111111111111111111111111111       (反码+1)

转变为size_t(以4个字节为例)不需要补充 所以b视为无符号数的源码;

4294967295;

会导致无限循环

 



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。