前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >杂谈c语言——5.类型提升

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

作者头像
用户11286441
发布2024-09-23 19:43:16
740
发布2024-09-23 19:43:16
举报
文章被收录于专栏:学习

1.习题一

代码语言:javascript
复制
#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.习题二

代码语言:javascript
复制
#include <stdio.h>
int main()
{
 char a = -128;
 printf("%u\n",a);
 return 0;
}           //代码1
代码语言:javascript
复制
#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.习题三 

代码语言:javascript
复制
#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; 会导致无限循环

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.习题一
  • 2.习题二
  • 3.习题三 
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档