关于变量赋值问题

hardy2014 2014-01-14 05:30:48
main()
{
int a = 5;
char c;

c = d;
printf("c=%d",c);
}

不是a要占用4个Byte内存,而c只申请1个Byte的内存吗?

这为啥能得出c=5的结果呢?
...全文
218 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
F_U_C_K_GFW 2014-01-15
  • 打赏
  • 举报
回复

double x = 3.14;
	unsigned int z = x;
像这样,明显会丢失小数部分的,所以编译器会给予警告。 但是如果这样

double x = 3.1415;
	unsigned int z = (unsigned int)x;
就是在告诉编译器,我知道这么做为丢失数据,不要给我警告。
F_U_C_K_GFW 2014-01-15
  • 打赏
  • 举报
回复

int main()
{
	int a = 128;
	char c;
	c = a;
	printf("c=%d", c);

	return 0;

}
这是一个隐式类型转换,在赋值语句中,如果右操作数与左操作数的类型不一致,总是将右操作数转换为左操作数的类型,因为5在char(-128~127)的范围内,所以不会丢失数据。但是如果像上面一样,将a设为128,结果就不正确
赵4老师 2014-01-15
  • 打赏
  • 举报
回复
引用 17 楼 learner520 的回复:
[quote=引用 14 楼 zhao4zhong1 的回复:] 试试release版 ?
试过了,没有看出来有啥区别的? 要怎么看呢?谢谢[/quote] 再试试release版,优化选项由Speed改为Size
赵4老师 2014-01-15
  • 打赏
  • 举报
回复
试试设置不同的对齐:
#include <stdio.h>
#define field_offset(s,f) (int)(&(((struct s *)(0))->f))
struct AD  { int a; char b[13]; double c;};
#pragma pack(push)
#pragma pack(1)
struct A1  { int a; char b[13]; double c;};
#pragma pack(2)
struct A2  { int a; char b[13]; double c;};
#pragma pack(4)
struct A4  { int a; char b[13]; double c;};
#pragma pack(8)
struct A8  { int a; char b[13]; double c;};
#pragma pack(16)
struct A16 { int a; char b[13]; double c;};
#pragma pack(pop)
int main() {
    printf("AD.a %d\n",field_offset(AD,a));
    printf("AD.b %d\n",field_offset(AD,b));
    printf("AD.c %d\n",field_offset(AD,c));
    printf("\n");
    printf("A1.a %d\n",field_offset(A1,a));
    printf("A1.b %d\n",field_offset(A1,b));
    printf("A1.c %d\n",field_offset(A1,c));
    printf("\n");
    printf("A2.a %d\n",field_offset(A2,a));
    printf("A2.b %d\n",field_offset(A2,b));
    printf("A2.c %d\n",field_offset(A2,c));
    printf("\n");
    printf("A4.a %d\n",field_offset(A4,a));
    printf("A4.b %d\n",field_offset(A4,b));
    printf("A4.c %d\n",field_offset(A4,c));
    printf("\n");
    printf("A8.a %d\n",field_offset(A8,a));
    printf("A8.b %d\n",field_offset(A8,b));
    printf("A8.c %d\n",field_offset(A8,c));
    printf("\n");
    printf("A16.a %d\n",field_offset(A16,a));
    printf("A16.b %d\n",field_offset(A16,b));
    printf("A16.c %d\n",field_offset(A16,c));
    printf("\n");
    return 0;
}
//AD.a 0
//AD.b 4
//AD.c 24
//
//A1.a 0
//A1.b 4
//A1.c 17
//
//A2.a 0
//A2.b 4
//A2.c 18
//
//A4.a 0
//A4.b 4
//A4.c 20
//
//A8.a 0
//A8.b 4
//A8.c 24
//
//A16.a 0
//A16.b 4
//A16.c 24
//
//
盘子饿了 2014-01-15
  • 打赏
  • 举报
回复
你换成大于128的数试试
hardy2014 2014-01-15
  • 打赏
  • 举报
回复
引用 14 楼 zhao4zhong1 的回复:
试试release版 ?
试过了,没有看出来有啥区别的? 要怎么看呢?谢谢
hardy2014 2014-01-15
  • 打赏
  • 举报
回复
弄清楚这些数据在内存中是怎么存储的后,就搞懂了,谢谢大家了
_xiaoyan_ 2014-01-15
  • 打赏
  • 举报
回复
char存数范围0到255 超过就有问题了
赵4老师 2014-01-15
  • 打赏
  • 举报
回复
试试release版 ?
「已注销」 2014-01-15
  • 打赏
  • 举报
回复
总觉得有时候解释一件事情是很困难的。
赛博Cookie 2014-01-14
  • 打赏
  • 举报
回复
一个字节8bite 5就是00000101,赋值给c还是不变
SKATE11 2014-01-14
  • 打赏
  • 举报
回复
5太小了 换大的就装不下了
AndyStevens 2014-01-14
  • 打赏
  • 举报
回复
起始是“整形提升” 在作怪,这正式printf 的 %d 能正确输出好几个类型的值如char short的原因。
Mr. Code 2014-01-14
  • 打赏
  • 举报
回复
printf用%d打印char没什么问题的,是多少都能打印出来,这相当于把char值赋给整型,不会溢出和截断,反过来char=int则会被截断。
hardy2014 2014-01-14
  • 打赏
  • 举报
回复
上面是: c=a; 意思明白了,但是详细的处理过程不了解,大家能详细地说明这里存储过程吗?
  • 打赏
  • 举报
回复
换个稍微大点数试试
肖邦之离歌 2014-01-14
  • 打赏
  • 举报
回复
引用 楼主 learner520 的回复:
c = d;//这个a吧。。
引用 1 楼 u011569364 的回复:
c=d;//这里改成c=a;
这里改成c=a
偏爱风流 2014-01-14
  • 打赏
  • 举报
回复
d是怎么来的
max_min_ 2014-01-14
  • 打赏
  • 举报
回复
一个Byte有8个bite的!
肖邦之离歌 2014-01-14
  • 打赏
  • 举报
回复
5这个数太小了,你用1000试试; c=d;这个赋值的时候只是简答的把d截断,把一个字节赋值给c,打印的时候又转化成了整型,在前面补了三个字节0,所以最后打印结果是5

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧