关于变量赋值问题

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的结果呢?
...全文
210 20 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
总觉得有时候解释一件事情是很困难的。
程序员贝塔 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
通过本课程学习您可以学习到Dart语言如下知识:第1章 Dart语言概述:Dart语言简介、Dart语言支持平台开发、Flutter为什么选择Dart语言。第2章 开发环境搭建:下载Dart SDK、Windows下安装Dart SDK、macOS下安装Dart SDK、Visual Studio Code开发工具、IntelliJ IDEA开发工具。第3章 完成个Dart程序:动动手写一个HelloWorld、Dart源代码文件组织结构、Visual Studio Code调试Dart代码、IntelliJ IDEA调试Dart代码。第4章 Dart语法基础:标识符、关键字、变量、常量、注释、库。第5章 Dart数据类型:数值类型、字符串、数据类型相互转换、布尔类型和枚举类型第6章 运算符:算术运算符、算术赋值运算符、关系运算符、逻辑运算符、位运算符、条件运算符、类型检查运算符。第7章 控制语句:分支语句、循环语句、跳转语句。第8章 函数:函数声明、可选参数、头等函数(first-class function)、匿名函数。第9章 类:类声明、getter和setter访问器、构造函数、静态变量和静态方法、级联符号。第10章 继承与多态:Dart中的继承实现、调用父类构造函数、成员变量的覆盖(Override)、方法的覆盖(Override)、多态、混入(Mixins)。第11章 抽象类与接口:抽象类、接口、Dart中隐式接口、实现接口。第12章 数据容器:List容器、Set容器、Map容器、泛型。第13章 异常处理:捕获异常、try-on捕获异常、try-catch捕获异常、try-on-catch捕获异常、使用finally代码块、手动抛出异常、自定义异常类。第14章 异步编程:Dart异步处理机制、案例:同步函数实现读取文件、案例:异步函数实现读取文件、Future对象。  

69,382

社区成员

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

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