Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c Cocoa:NSUTEGER和UInt32都定义为32位无符号整数。那么,为什么要发出警告呢?_Objective C_Xcode_Cocoa_Osx Lion_Nsuinteger - Fatal编程技术网

Objective c Cocoa:NSUTEGER和UInt32都定义为32位无符号整数。那么,为什么要发出警告呢?

Objective c Cocoa:NSUTEGER和UInt32都定义为32位无符号整数。那么,为什么要发出警告呢?,objective-c,xcode,cocoa,osx-lion,nsuinteger,Objective C,Xcode,Cocoa,Osx Lion,Nsuinteger,在标题中,我可以看到,对于我编译的64位系统,NSUInteger和UInt32都被定义为32位无符号整数,那么当我将一个整数分配给另一个时,为什么Xcode在警告中声明精度损失呢 “隐式转换将丢失整数精度:'NSUInteger'(也称为‘unsigned long’)到‘UInt32’(也称为‘unsigned int’)” 我可以看到警告将一个表示为“long”,另一个表示为“int”,但由于在这个系统中它们都解析为相同的32位无符号整数,因此精度应该不会降低 这实际上并没有造成任何问题,

在标题中,我可以看到,对于我编译的64位系统,NSUInteger和UInt32都被定义为32位无符号整数,那么当我将一个整数分配给另一个时,为什么Xcode在警告中声明精度损失呢

“隐式转换将丢失整数精度:'NSUInteger'(也称为‘unsigned long’)到‘UInt32’(也称为‘unsigned int’)”

我可以看到警告将一个表示为“long”,另一个表示为“int”,但由于在这个系统中它们都解析为相同的32位无符号整数,因此精度应该不会降低

这实际上并没有造成任何问题,但似乎我可能误解了一些东西,所以我想更好地理解

有一个问题,但它涉及的是安全,而不是“为什么”:
NSUInteger
NSInteger
甚至可以在iOS和OSX中使用

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
    typedef long NSInteger; 
    typedef unsigned long NSUInteger;
#else 
    typedef int NSInteger; 
    typedef unsigned int NSUInteger;
#endif
iOS是32位设备,而OSX是64位设备(早期的OSX是32位的,甚至您可以选择为32位操作系统创建应用程序),因此它包含一个
if-else指令,它是根据该指令设置的

在OSX中,我总是将
%ld
NSInteger
一起使用,但在iOS中它必须是
%d


如果将
%d
用于
NSInteger
则会显示警告丢失整数精度。

NSInteger
NSInteger
甚至可以在iOS和OSX中使用

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
    typedef long NSInteger; 
    typedef unsigned long NSUInteger;
#else 
    typedef int NSInteger; 
    typedef unsigned int NSUInteger;
#endif
iOS是32位设备,而OSX是64位设备(早期的OSX是32位的,甚至您可以选择为32位操作系统创建应用程序),因此它包含一个
if-else指令,它是根据该指令设置的

在OSX中,我总是将
%ld
NSInteger
一起使用,但在iOS中它必须是
%d


如果对
NSInteger
使用
%d
,则会显示警告丢失整数精度。

在64位OS X平台上:

  • NSUInteger
    被定义为
    unsigned long
    ,并且
  • unsigned long
    是一个64位无符号整数
因此
UInt32
NSUInteger
的大小不同,这就解释了编译器警告

另请参见“基础数据类型参考”中的内容:

在构建32位应用程序时,整数是32位无符号的 整数。64位应用程序将整数视为64位无符号整数 整数


备注:64位OS X使用(与许多Unix和类Unix系统一样)LP64数据模型,这意味着long指针具有64位。64位Windows使用IL32P64数据模型,其中long具有32位,而指针具有64位。

在64位OS X平台上:

  • NSUInteger
    被定义为
    unsigned long
    ,并且
  • unsigned long
    是一个64位无符号整数
因此
UInt32
NSUInteger
的大小不同,这就解释了编译器警告

另请参见“基础数据类型参考”中的内容:

在构建32位应用程序时,整数是32位无符号的 整数。64位应用程序将整数视为64位无符号整数 整数


备注:64位OS X使用(与许多Unix和类Unix系统一样)LP64数据模型,这意味着long指针具有64位。64位Windows使用IL32P64数据模型,其中long有32位,而指针有64位。

可能是因为在其他系统上NSUInteger可以变为64位长。可能是因为在其他系统上NSUInteger可以变为64位长。在OSX下编译32位时如何?好的,谢谢。那么,关于编译器的工作方式,这是否意味着它在解析if-else指令之前计算警告,所以还没有意识到这是不必要的?@特洛伊木马敌人:在这种情况下,它将是32位的,与if-else指令OK一样,因此语句“OSX是64位的”是不准确的。那当你在OSX下编译32位时呢?好的,谢谢。那么关于编译器是如何工作的,这是否意味着它在解析if-else指令之前计算警告,所以还没有意识到这是不必要的?@特洛伊木马敌人:在这种情况下,它将是32位的,就像if-else指令OK一样,因此“OSX是64位的”语句不准确。谢谢,我想我在解释MacTypes中的头方面是个新手。h:UInt32位无符号整数。。。typedef无符号整数UInt32;在NSObjCRuntime.h:#如果LP64 | |(TARGET|OS|u EMBEDDED&!TARGET|OS_IPHONE)| TARGET|OS|u WIN32 | NS|u BUILD|u 32|u LIKE_64 typedef long NSInteger;typedef无符号长整数@是的,那正是它被定义的地方
\uuuuLP64\uuuuuu
在64位平台上为真,整数定义为无符号长,无符号长在64位平台上为64位由于Uint32只有32位,因此可能会丢失精度。谢谢。(很抱歉,这条评论太乱了,似乎无法在评论中添加新行,因此每次我习惯性地点击“return”时,它都会被发布6次左右。)@JoeyFourSheds:不客气。我已经添加了一些关于
long
大小的信息。谢谢,我想我在解释MacTypes中的头方面是个新手。h:UInt32位无符号整数。。。typedef无符号整数UInt32;在NSObjCRuntime.h:#如果LP64 | |(TARGET|OS|u EMBEDDED&!TARGET|OS_IPHONE)| TARGET|OS|u WIN32 | NS|u BUILD|u 32|u LIKE_64 typedef long NSInteger;typedef无符号长整数@是的,那正是它被定义的地方<代码>\u\L