《Objective-C 编程》7.数字

基础数据类型

Tips: 合理使用限定词: longlong longshortunsignedsigned 可以弹性地获取内存空间以节约内存。

数字

一、整数

  • 整数是没有小数点的数——一个完整的数;
  • 为了保存数字,整数变量会占用一定的 位(bit)数空间。典型的整数尺寸有 8 位、16 位、32 位和 64 位,而 8 位的无符号数可以保存 0~255 之间的整数。(1 byte = 8 bit)
  • 整数还有 有符号无符号 两种类型。charshortintlonglong long 默认是有符号 的,加上 unsigned 前缀可以得到无符号的版本。

整数的声明

整数变量类型 描述
UInt32 无符号 32 位整数
SInt16 有符号 16 位整数
Char 8 位
Short 通常是 16 位
Int 通常是 32 位
long 32 位或 64 位
long long 64 位

注:整数类型所占的位数是平台相关的。

用于显示整数的格式说明符号

进制 格式说明符
十进制 %d
八进制 %o
十六进制 %x

示例代码:

int x = 255;
printf("x is %d.\n",x);                // x is 255.
printf("In octal,x is %o.\n",x);       // In octal,x is 377.
printf("In hexadecimal,x is %x.\n",x); // In hexadecimal,x is ff.

对于位数很多的大整数,可以在 % 和转换字符之间加入一个 l(针对 long) 或 ll(针对 long long)。示例代码如下:

long x = 255;
printf("x is %ld.\n",x);                // x is 255.
printf("In octal,x is %lo.\n",x);       // In octal,x is 377.
printf("In hexadecimal,x is %lx.\n",x); // In hexadecimal,x is ff.

如果要输出的是无符号的十进制数,就应该使用 %u:

unsigned long x = 255;
printf("x is %lu.\n",x); // x is 255.

// 按八进制和十六进制输出时,会假设数字是无符号的
printf("In octal,x is %lo.\n",x);       // In octal,x is 377.
printf("In hexadecimal,x is %lx.\n",x); // In hexadecimal,x is ff.

传入特定参数,来设置最小字段宽度和最小数字位数(默认两者都是 0)

// 正数
int m = 42;
NSString *s = [NSString stringWithFormat:@"'%4d' '%-4d' '%+4d' '%4.3d' '%04d'", m, m, m, m, m];
// "[  42] [42  ] [ +42] [ 042] [0042]"

// 负数
int m = -42;
NSString *s = [NSString stringWithFormat:@"'%4d' '%-4d' '%+4d' '%4.3d' '%04d'", m, m, m, m, m];
// "[ -42] [-42 ] [ -42] [-042] [-042]"

整数运算符

  • 算数运算符 +-* 的作用与数学运算符相同;
  • 算数运算符遵循的优先规则:* 会在 +- 之前运算;

整数除法

printf("11 / 3 = %d\n",11 / 3);    //  11 / 3 = 3
printf("-11 / 3 = %d\n", -11 / 3); // -11 / 3 = -3

在C语言中,一个整数除以另一个整数,得到的还是整数。系统会将计算结果向 0 的方向取整;

// 11 除以 3,得 3,余 2
printf("11 / 3 = %d remainder of %d\n",11 / 3 , 11 % 3); // 11 / 3 = 3 remainder of 2

如果要得到 3.666667 这样的结果,就要先通过转换运算符(cast operator)将 int 类型转换成 float 类型,让代码执行浮点数除法
转换运算符:指需要转换的目标类型,但是要放在小括号里,并写在需要转换的变量的左侧。
转换运算符的转换规则:

  • 如果分子和分母都是整数类型,那么/ 执行的是 整数除法
  • 如果分子和分母有任何一个是浮点数,就会执行 浮点数除法
printf("11 / 3.0 = %f\n",11 / (float)3); // 11 / 3.0 = 3.666667

这里的分母是浮点数,所以执行的是浮点数除法

二、NSInteger 和 NSUInteger

  • NSIntegerNSUInteger 这两种类型无论在 32 位系统还是 64 位系统上都能够通用。NSInteger 是有符号的,NSUInteger 是无符号的。
  • 构建 32 位应用程序时,NSInteger 是 32 位整数。 而 64 位应用程序时会将 NSInteger 视为 64 位整数。
  • 构建 32 位应用程序时,NSUInteger 是一个 32 位无符号整数。而 64 位应用程序会将 NSUInteger 视为 64 位无符号整数。
  • 使用 printf() 输出这两种类型的变量,需要先将它们转换成对应的 long 类型。

NSIntegerNSUInteger 只是基本整数类型的 typedef 宏定义:

#if __LP64__ || NS_BUILD_32_LIKE_64
  typedef long NSInteger;
  typedef unsigned long NSUInteger;
#else
  typedef int NSInteger;
  typedef unsigned int NSUInteger;
#endif

NSIntegerNSUInteger 之间的相互转换,只需要做简单的投射:

NSInteger myInt = 0;
NSUInteger unsignedInt = (NSUInteger)myInt;

三、赋值运算符

C语言中的运算符

摘自维基百科
  • 自增运算符(++)
Int x = 5;
x++; // x = x + 1; 
  • 自减运算符(--)
Int x = 5;
x--; // x = x - 1;
  • +=、-=、*=、/=、%=
Int x = 5;
x +=5; // x = x + 5;
  • 函数:abs()labs()
    以上函数在标准函数库 stdlib.h 中被声明。
函数名 描述
abs() 计算 int 类型数的绝对值
labs() 计算 long 类型数的绝对值

四、浮点数

  • 浮点数可以用来代表 “带十进制小数的数”;
  • 要区分浮点常量,可以看它是否包含小数点;
  • 浮点常量可以用科学记数法表示(1.7e4 代表1.7*10^4);
  • 操作系统存储浮点数的方式:某个底数乘上一个以10为底的指数幂(指数为整数);
  • 与整数一样,浮点数也有不同的尺寸类型,但是浮点数都是有符号的。
  • double 类型的变量可存储的范围大概是 float 的两倍;
数据类型 位数
float 32位
double 64位
long double 128位

用于显示浮点数的格式说明符

计数方法 格式说明符
十进制计数法 %f
科学计数法 %e
%f%e 中较短的输出宽度输出单、双精度实数,在指数小于-4或者大于等于精度时使用%e格式 %g
double y = 12345.6789;
printf("y is %f\n",y); // y is 12345.678900
printf("y is %e\n",y); // y is 1.234568e+04

// 小数点后保留2位
double y2 = 12345.6789;
printf("y2 is %.2f\n",y2); // y2 is 12345.68
printf("y2 is %.2e\n",y2); // y2 is 1.23e+04

浮点数的格式转符有8个:eEfFgGaA。但除了 %f%g 外我们很少使用其它的。对于指数部分,小写的版本使用小写 e,大写的版本就使用大写 E。

通常 %g 是浮点数的全能转换符 ,它与 %f 的不同在下面的例子里显示得很清楚:
%g会根据变量值自动选择格式转换符(%f / %e)用最小的位数来显示数值)

double v[5] = {12345, 12, 0.12, 0.12345678901234, 0.0000012345678901234};
NSString *s = [NSString stringWithFormat:@"%g %g %g %g %g", v[0], v[1], v[2], v[3], v[4]];
// "12345 12 0.12 0.123457 1.23457e-06"
NSString *s = [NSString stringWithFormat:@"%f %f %f %f %f", v[0], v[1], v[2], v[3], v[4]];
// "12345.000000 12.000000 0.120000 0.123457 0.000001"

整数值和浮点值的相互转换

隐式转换规则:

  • 浮点值➡️整型变量,自动删除数字的小数部分。
  • 整型变量➡️浮点值,不变。
  • 只要表达式中的两个运算数是整型,该运算就将在整数运算规则下进行。
  • 对于任何处理两个值的运算,如果其中一个值是浮点变量或常量,那么这一运算将作为浮点运算来处理。

五、数学代码库

  • 当要处理复杂的数学运算时,就要用到数学代码库:math.h
  • 运行 Mac 上的终端(Terminal)应用,输入 man math(并回车),可以查看数学代码库所提供的功能;
  • 注意:所有与三角函数有关的函数,使用的单位都是 弧度 而不是角度。

以下是整理的常见数学函数:

// 生成随机数
// 生成 [0, x-1] 之间的随机数
int value = arc4random() % x;
// 生成 [1, x] 之间的随机数
int value = (arc4random() % x) + 1;
// 生成 [0, 1] 之间的随机数
float value3 = (arc4random() % 100) / 100.0;


// 其他常用数学函数
rand():产生随机数
abs()、labs():整数的绝对值
fabs()、fabsf()、fabsl():浮点数的绝对值
floor()、floorf()、floorl():向下取整
ceil()、ceilf()、ceill():向上取整
round()、roundf()、roundl():四舍五入
sqrt()、sqrtf()、sqrtl():求平方根
fmax()、fmaxf()、fmaxl():求最大值
fmin()、fminf()、fminl():求最小值
hypot()、hypotf()、hypotl():求直角三角形斜边的长度
fmod()、fmodf()、fmodl():求两数整除后的余数
modf()、modff()、modfl():浮点数分解为整数和小数
frexp()、frexpf()、frexpl():浮点数分解尾数和以二为底的指数
  

// 三角运算函数
sin()、sinf()、sinl():   求正弦值
sinh()、sinhf()、sinhl():求双曲正弦值
cos()、cosf()、cosl():   求余弦值
cosh()、coshf()、coshl():求双曲余弦值
tan()、tanf()、tanl():   求正切值
tanh()、tanhf()、tanhl():求双曲正切值


// 反三角运算 
asin()、asinf()、asinl():   求反正弦值
asinh()、asinhf()、asinhl():求反双曲正弦值
acos()、acosf()、acosl():   求反余弦值
acosh()、acoshf()、acoshl():求反双曲余弦值
atan()、atanf()、atanl():   求反正切值
atan2()、atan2f()、atanl(): 求坐标值的反正切值
atanh()、atanhf()、atanhl():求反双曲正切值
   

// 指数和对数运算
pow()、powf()、powl():      求 n 的 m 次方的值
exp()、expf()、expl():      求 e 的 x 次方的值
exp2()、exp2f()、exp2l():   求 2 的 x 的次方的值
log()、logf()、logl():      求以 e 为底的对数值
log10()、log10f()、log10l():求以 10 为底的对数值
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352