前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c语言习题之类型转换

c语言习题之类型转换

作者头像
黎鹤舞
发布2024-03-19 15:12:06
700
发布2024-03-19 15:12:06
举报

题目

给定下面的代码,判断输出值:

代码语言:javascript
复制
#include <stdio.h>
int i;
int main()
{
    i--;
    if (i > sizeof(i))
    {
        printf(">\n");
    }
    else
    {
        printf("<\n");
    }
    return 0; 
}

正确答案:

答案是: >

题解

这一题可能让很多人感觉惊讶,明明 i 的初始值默认为0,i–之后应该变成-1了呀。sizeof( i ) 求得的应该是 i 的字节数 应该是4 呀,难不成是sizeof( i )出了问题? 我们测试一下

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int i;
int main()
{
    i--;
    printf("sizeof(i) is %d\n",sizeof(i));
    if (i > sizeof(i))
    {
        printf(">\n");
    }
    else
    {
        printf("<\n");
    }
    return 0;
}

结果如图:

我们会发现 sizeof的结果就是4,并没有出错。

那么到底是哪里出错了呢?

我们再回到sizeof上,当我们鼠标移动到sizeof关键字上面去,会发现这样一段描述:

这是编译器为我们解释了 sizeof( )这个函数 这时我们会发现:sizeof()函数的返回值类型不是 int 而是 unsigned int 那么unsigned int 和 int 有什么区别呢 ?

unsigned int 和 int 的区别

从名字我们可以看出,一个是无符号数整形 unsigned ; 一个是有符号数整形 signed int,但是我们通常习惯把signed 省略,剩下就是我们常见的 int 类型数据。 他们最大的区别就是有无符号位的区别: unsigned int 没有符号位,所以他的数据范围是2^32 -1。 int 类型的第一位二进制存储的是负数,所以他的数据范围是-2^31 ~ 2^31 -1。 而且我们要知道数据再计算机中是以补码的方式进行存储的

所以我们再回过头看这个题目 int 类型的数据和 unsigned int 类型数据进行比较时,编译器会自动将 int 类型的数据转化为unsigned int 类型的数据。 int 类型中 -1的补码是 11111111 11111111 11111111 11111110,转化成unsiged int 类型的数据,是一个非常大的数字,所以打印 > 。

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

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

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

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

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