鱼C论坛

 找回密码
 立即注册
查看: 5259|回复: 17

两个short类型之和的长度

[复制链接]
发表于 2013-5-18 23:38:18 | 显示全部楼层 |阅读模式
1鱼币
void main()
{
    short i;short j;
    printf("%d\n",sizeof(i));
    printf("%d\n",sizeof(j));
    printf("%d\n",sizeof(i+j));
}
请教:为什么输入 2,2,4而不是2,2,2?

最佳答案

查看完整内容

因为你的i+j没有给指定类型,编译器(我的是VS2010)认为是int型的,所以是4. 如果你把代码写成 short k =i + j; printf("%d\n",sizeof(k)); 那么结果就是 2 了。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-5-18 23:38:19 | 显示全部楼层
因为你的i+j没有给指定类型,编译器(我的是VS2010)认为是int型的,所以是4.
如果你把代码写成
short k =i + j;  
printf("%d\n",sizeof(k));
那么结果就是 2 了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-5-18 23:42:51 | 显示全部楼层
很简单啊 2+2 = 4
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-5-18 23:44:32 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-5-18 23:45:04 | 显示全部楼层
我只是路过打酱油的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-5-19 00:30:13 | 显示全部楼层
顶人气的,本人路过
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-5-19 03:20:22 | 显示全部楼层
本帖最后由 熊文杰 于 2013-5-19 03:21 编辑

原因很简单,你的i和j没有给初始值,临时变量的初始值系统默认是很大的,我在vs2005上看的是0xcccc,
两个这么大的数相加,已经超过了short能够表示的范围了,默认会被提升为更大字节的数据类型,比short大的也就是被提升为int类型了。sizeof(int) = 4.
如果你给的初始值,比如i=1,j = 2的话,你再看看结果,结果也会是2的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-5-19 09:52:40 | 显示全部楼层
熊文杰 发表于 2013-5-19 03:20
原因很简单,你的i和j没有给初始值,临时变量的初始值系统默认是很大的,我在vs2005上看的是0xcccc,
两个 ...

        short i=1;short j=2;
        printf("%d\n",sizeof(i));
        printf("%d\n",sizeof(j));
        printf("%d\n",sizeof(i+j));
还是2,2,4。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-5-19 11:58:17 | 显示全部楼层
麻雀怒吼 发表于 2013-5-19 09:52
short i=1;short j=2;
        printf("%d\n",sizeof(i));
        printf("%d\n",sizeof(j));

你试试 sizeof(i+i+j);
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-5-19 12:40:45 | 显示全部楼层
2594611034 发表于 2013-5-19 11:58
你试试 sizeof(i+i+j);

还是2,2,4?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-5-19 13:26:48 | 显示全部楼层
麻雀怒吼 发表于 2013-5-19 09:52
short i=1;short j=2;
        printf("%d\n",sizeof(i));
        printf("%d\n",sizeof(j));

不纠结了看这句

其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一般定义为
typedef unsigned int size_t;

sizeof的返回类型是unsigned int ,这个就是4个字节的。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-5-19 14:20:28 | 显示全部楼层
熊文杰 发表于 2013-5-19 13:26
不纠结了看这句

其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一般定 ...

sizeof的返回值类型和返回值应该不是一个东西把。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-5-19 14:36:21 | 显示全部楼层
本帖最后由 熊文杰 于 2013-5-19 14:37 编辑
麻雀怒吼 发表于 2013-5-19 14:20
sizeof的返回值类型和返回值应该不是一个东西把。

不管你的返回值是什么。返回类型是unsigned int类型,你试试sizeof(unsigned int);这个输出的就是4
一个类型就有其固定的大小。short是2个字节,int是4个字节 unsigned int 4个字节,long long 8个字节
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-5-19 15:44:40 | 显示全部楼层
熊文杰 发表于 2013-5-19 14:36
不管你的返回值是什么。返回类型是unsigned int类型,你试试sizeof(unsigned int);这个输出的就是4
一 ...

你求 a = sizeof(x),  与sizeof(y), 不一样吧, 一个是返回值一个是求得的值
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-5-19 15:52:10 | 显示全部楼层
熊文杰 发表于 2013-5-19 14:36
不管你的返回值是什么。返回类型是unsigned int类型,你试试sizeof(unsigned int);这个输出的就是4
一 ...

返回值不管是4还是2,都是uint类型。这个我能理解,但是如果因为返回的是uint类型,显示的就是4的话,我就不理解了。比如 short i=8;sizeof(i);返回的也是一个int类型的值 但这个值是2
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-5-19 16:02:42 | 显示全部楼层
看视频不认真呀,又看了遍数据类型的视频,小甲鱼有句话"char型和short型参与运算时,必须先转换为int型"
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-5-19 16:25:35 | 显示全部楼层
我觉得是这样的:
如果你这样
  1. sizeof(100);
复制代码
结果是4, 因为100为int 型
如果你这样:
  1. sizeof('a');
复制代码
结果是:1, 因为'a'是char, 回到你那题, 如果这样:
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         short a = 9; short b = 10;
  5.         short c = a+b;
  6.         printf("a = %d\n", sizeof(a));        //定义为short
  7.         printf("b = %d\n", sizeof(b));        //定义为short
  8.         printf("c = %d\n", sizeof(c));        //定义为short
  9.         printf("?= a+b = %d\n", sizeof(a+b));//没有定义a+b, 相当于sizeof(8)这样
  10.         printf("? = a+b+c = %d\n", sizeof(a+b+c));        //没有定义a+b+c, 相当于sizeof(8)这样
  11.         return 0;
  12. }
复制代码
个人见解, sizeof()会把括号中的当做一个整体来看吧。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-5-19 19:23:00 | 显示全部楼层
我只是路过打酱油的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-28 05:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表