linux的GCC下类型转换,大家帮忙解释一下。程序结果在下面

linux的GCC下类型转换,大家帮忙解释一下。程序结果在下面,第1张

这个比较奇怪,printf这个函数确实有不少隐患。

估计应该是printf其实并没有对参数进行严格的类型转换,而是直接使用了参数的内容:

比如第一个%f,需要一个浮点数,会使用8个字节的内存内容,而传入的只有4个字节的,因此就会有4个字节的值是每次都不一样的

第二个%d,5.01是一个double型的值,8个字节,%d取了4个字节,因此每次都是固定值。

===

具体的再研究下先

字符及字符串处理函数:字符及字符串处理函数的处理对象均为字符型数据,但其返回值类型各异.

1.取子串函数:

格式:substr(c,n1,n2)

功能:取字符串C第n1个字符起的n2个字符.返回值类型是字符型.

例:取姓名字符串中的姓.

store "王小风" to xm

?substr(xm,1,2)

结果为:王

2.删除空格函数:以下3个函数可以删除字符串中的多余空格,3个函数的返回值均为字符型.

trim(字符串):删除字符串的尾部空格

alltrim(字符串):删除字符串的前后空格

ltrim(字符串):删除字符串的前面的空格

例:去掉第一个字符串的尾空格后与第二个字符串连接

store "abcd " to x

store "efg" to y

?trim(x)+y

abcdefg

3.空格函数:

格式:space(n)

说明:该函数的功能是产生指定个数的空格字符串(n用于指定空格个数).

例:定义一个变量dh,其初值为8个空格

store space(8) to dh

4.取左子串函数:

格式:left(c,n)

功能:取字符串C左边n个字符.

5.取右子串函数:

格式:right(c,n)

功能:取字符串c右边的n个字符

例:a="我是中国人"

?right(a,4)

国人

?left(a,2)

6.empty(c):用于测试字符串C是否为空格.

7.求子串位置函数:

格式:At(字符串1,字符串2)

功能:返回字符串1在字符串2的位置

例:?At("教授","副教授")

2

8.大小写转换函数:

格式:

lower(字符串)

upper(字符串)

功能:lower()将字符串中的字母一律变小写upper()将字符串中的字母一律变大写

例:

bl="FoxBASE"

?lower(bl)+space(2)+upper(bl)

foxbase FOXBASE

9.求字符串长度函数:

格式:len(字符串)

功能:求指定字符串的长度

例:a="中国人"

?len(a)

6

二.数学运算函数:

1.取整函数:

格式:int(数值)

功能:取指定数值的整数部分.

例:取整并显示结果

?int(25.69)

25

2.四舍五入函数:

格式:round(数值表达式,小数位数)

功能:根据给出的四舍五入小数位数,对数值表达式的计算结果做四舍五入处理

例:对下面给出的数四舍五入并显示其结果

?round(3.14159,4),round(2048.9962,0),round(2048.9962,-3)

3.1416 2049 2000

3.求平方根函数:

格式:sqrt(数值)

功能:求指定数值的算术平方根

例:?sqrt(100)

10

4.最大值、最小值函数:

格式:

Max(数值表达式1,数值表达式2)

Min(数值表达式1,数值表达式2)

功能:返回两个数值表达式中的最大值和最小值

例:

x1=123.456

x2=234.567

?max(x1,x2)

234.567

?min(x1,x2)

123.456

5.求余数函数:

格式:mod(表达式1,表达式2)

功能:求表达式1对表达式2的余数

例:

?mod(10,3)

1

6.求指数、对数函数:

格式:

exp(数值表达式)

log(数值表达式)

功能:

(1).exp()计算自然数e为底,表达式的值为指数的幂

(2).log()计算表达式值的自然对数,返回lnx的值.

例:

x=1

y=exp(x)

?exp(x),log(x)

2.72 1

三.转换函数:

1.数值转数字字符串函数:

格式:str(n,n1,n2)

功能:将数值n转换为字符串,n1为总长度,n2为小数位

例:?str(321.56)

322 隐含四舍五入取整转换为字符型数据

?str(321.56,6,2)

321.56

2.字符转数值函数:

格式:val(s)

功能:将数字字符串s转换为数值

例:x="23"

y="76"

?val(x)+val(y)

100

3.字符转日期函数:

格式:ctod(c)

功能:将日期字符串c转换为日期

例:set date ansi 日期格式设为美国标准化协会格式

?ctod("^2005.11.14")

2005.11.14

4.日期转字符函数:

格式:dtoc(d)

功能:将日期d转化为日期字符串

例:将日期型数据转化为字符型日期数据并显示汉字日期.

set century on 开启世纪前缀,即日期中年份用4位表示

set date ansi

rq={^2005.11.14}

rq=dtoc(rq)

?substr(rq,1,4)+"年"+substr(rq,6,2)+"月"+substr(rq,9,2)+"日"

2005年11月14日

5.时间转字符函数:

格式:ttoc(时间)

功能:将时间转为时间字符串

6.字符转时间函数:

格式:ctot(c)

功能:将时间字符串转化为时间

7.字符串替换函数:

格式:stuff(字符表达式1,起始位置,字符个数,字符表达式2)

功能:从指定位置开始,用表达式2的值去替换表达式1中指定个数字符.若字符个数为零,直接插入若表达式2为空字符串,则删除表达式1中指定个数的字符.

例:X="祝大家新年好!"

?stuff(X,7,4,"春节")

祝大家春节好

?stuff(X,11,0,"春节")

祝大家新年春节好

?stuff(x,7,4," ")

祝大家好

8.字符转ASCⅡ码函数:

格式:Asc(字符表达式)

功能:把字符表达式左边第一个字符转成相应的ASCⅡ码值

例:x="Foxpro"

?Asc(x),Asc(lower(x))

70 102

9.ASCⅡ码值转字符函数:

格式:chr(数值表达式)

功能:把数值转成相应的ASCⅡ码字符,返回值为字符型

例:?chr(70)+chr(111)+chr(111+9)

Fox

四.日期函数:

1.系统日期函数:

格式:date()

功能:给出系统的当前日期,返回值是日期型数据.

例:显示系统日期

?date()

11/14/05

set date ansi

set century on

?date()

2005.11.14

2.年、月、日函数:

格式:(1).year(日期表达式):从日期表达式中返回一个由四位数字表示的年份.

(2).month(日期表达式):从日期表达式中返回一个用数字表示的月份.

(3).day(日期表达式):从日期表达式中返回一个用数字表示的日数.

例:测试系统日期

rq=date()

?year(rq),month(rq),day(rq)

2005 11 14

3.系统时间函数:

格式:time()

功能:得到当前时间字符串

例:?time()

20:32:26

4.系统日期时间函数:

格式:datetime()

功能:得到当前日期时间

例:?datetime()

2005.11.14 08:35:12 PM

5.星期函数:

格式:dow(日期表达式)

cdow(日期表达式)

功能:dow用数字表示星期,1表示星期日,7为星期六cdow用英文表示星期

例:?date()

2005.11.15

?dow(date()),cdow(date())

3 Tuesday

五.测试函数:

1.测试文件尾函数:

格式:eof([n])

说明:

(1).n指定被测工作区号,其范围为1~32767

(2).该函数用于测试指定工作区中的表的记录指针是否指向文件尾,是则返回真值否则返回假值省略可选项指当前工作区.

例:测试文件记录指针是否指向文件尾

use 职工档案

go bottom

?eof()

.F.

skip

?eof()

.T.

2.测试文件头函数:

格式:bof([n])

说明:

(1).n指定被测工作区号,其范围为1~32767

(2).用于测试指定工作区中的表的记录指针是否指向文件头,是则返回真值否则返回假值省略可选项指当前工作区.

例:测试记录指针是否指向文件头

use 职工档案

go top

?bof()

.f.

skip -1

?bof()

.t.

3.测试当前记录号函数:

格式:recno()

功能:得到当前的记录号

例:

use 职工档案

?recno()

1

skip

?recno()

2

4.测试表文件记录数函数:

格式:reccount()

功能:得到表的记录数

例:测试"职工档案"表的记录数

use 职工档案

?reccount()

5

5.测试表字段数函数:

格式:fcount()

功能:得到当前的字段数

例:测试"职工档案"表共有多少个字段

use 职工档案

?fcount()

9

6.测试查找记录是否成功函数:

格式:found()

功能:测试find、seek和locate命令查找记录是否成功.如成功则返回真值,否则为假值.

例:在"职工档案"表中查找"小刚"的文化程度

use 职工档案

locate for 姓名="小刚"

?found()

.t.

display

7.文件测试函数:

格式:file(字符表达式)

功能:测试字符表达式指定的文件是否存在

例:?file("e:\myvfp\职工档案.dbf")

.t.

8.数据类型测试函数:

格式:type(字符表达式)

功能:测试表达式的数据类型,返回大写字母:N(数值)、C(字符)、L(逻辑)、D(日期)、M(备注)

例:

x=1236

y="hello"

?type("x")

N

?type("y")

C

9.测试工作区函数:

格式:select()

功能:返回当前工作区的区号

10.测试别名函数:

格式:alias()

功能:测试当前工作区的别名

例:

select 1

use 职工档案 alias zgda

select 2

use 工资情况

?alias()

工资情况 打开表时,不指定别名,表名即为别名

select zgda 通过别名选择工作区

?select()

1

11.表文件名函数:

格式:dbf()

功能:返回当前工作区打开的表名

例:

use 工资情况

?dbf()

e:\myvfp\工资情况

六.其它函数:

1.宏替换函数:

格式:变量名

说明:vfp中只有宏替换函数没有括号.功能是返回指定字符型变量中所存放的字符串.

例:为"工资情况"表中每个人加100元工资

gz="工资"

use 工资情况

replace all gz with gz+100

2.条件函数:

格式:iif(表达式,表达式1,表达式2)

功能:若表达式值为真,则返回表达式1的值否则返回表达式2的值函数返回值类型与表达式1或表达式2类型一致

a=3

b=5

?iif(ab,"高兴","开心")

开心

3.消息框函数:

格式:messagebox(提示文本[,对话框类型[,对话框标题文本]])

功能:显示提示对话框

说明:

(1)对话框类型:

对话框类型 功能

0 仅"确定"按钮

1 "确定"和"取消"按钮

2 "终止","重试"和"忽略"按钮

3 "是","否"和"取消"按钮

4 "是"和"否"按钮

5 "重试"和"取消"按钮

16 stop图标

32 ?图标

48 !图标

64 i图标

0 默认第1个按钮

256 默认第2个按钮

512 默认第3个按钮

(2).返回值:

返回值 按钮

1 确定

2 取消

3 终止

4 重试

5 忽略

6 是

7 否

例:分析messagebox("您确实要退出系统吗?",4+64,"提示信息")会d出什么样的窗口.

分析:回头观察此函数的格式,d出的对话框中的提示文本是"您确实要退出系统吗",对话框标题是"提示信息",

函数中间有"4+64",其中4指定对话框中出现"是"和"否"两个按钮(见表1),64指定对话框中出现i图标(见表2)

ok,我们在命令窗口依次执行下列命令:

tui=messagebox("您确实要退出系统吗?",4+64,"提示信息")

变量tui用于接收messagebox函数的返回值,d出的窗口如图1

?tui

变量tui值取决于运行时用户点了哪个按钮,如果点了"是",返回6,如果点了"否",返回7,见表2

说明:实际应用中,我们常在系统菜单或在表单的"退出"按钮中添加如下代码:

tui=messagebox("您确实要退出系统吗?",4+64,"提示信息")

if tui=6 如果此条件成立,说明用户点了"是"按钮,执行quit命令,安全退出

quit

endif

这和linux环境无关了,windows下也是这样的。

虽然8为的char可以表示256个字符,不过明显系统是用有符号数表示它的。超过127的数计算机就理解成负数了。200应该是表示为 -73

然后就是强制转换的问题了,系统先把-73按照补码的格式扩展到4个字节的int型,补码就是"111111111111111111111111101100101",后面几个01是我乱打的,懒得算了....然后用unsigned表示就是4294967240了。

至于LZ文为什么强制转化的unsigned int类型就按int类型来处理了,我只能说编译器就是这么做了,编程的时候还是得小心点。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9936605.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存