相关疑难解决方法(0)

双 - IEEE 754替代品

根据以下网站:http: //en.cppreference.com/w/cpp/language/types

"双精度浮点型.通常是IEEE-754 64位浮点型".

它说"通常".C++可以double使用哪些其他可能的格式/标准?什么编译器使用IEEE格式的替代品?还是建筑?

c++ ieee-754

6
推荐指数
2
解决办法
2190
查看次数

比特字段可以用作"穷人"的快速整数类型吗?

我刚刚注意到gcc关于位域的一个有趣的属性.如果我创建struct如下:

template <int N>
struct C
{
    unsigned long long data : N;
};
Run Code Online (Sandbox Code Playgroud)

然后在amd64:

  1. 使用-m64,对于Nε< 1,64 > sizeof(C) == 8;
  2. 对于-ε32,对于 < 1,32>,对于 < 33,64sizeof(C) == 4 > , sizeof(C) == 8.

(带sizeof(unsigned long long) == 8).

这看起来大部分类似于C99/C++ 11,uint_fastXX_t除了在我的系统上的事实sizeof(uint_fast8_t) == 1.但是,例如,我无法复制任何类似的东西__int128(总是导致sizeof(C) == 16).

在C++ 98中使用前面提到struct的"穷人"替代品似乎是个好主意吗?uint_fastXX_t

c++

6
推荐指数
1
解决办法
172
查看次数

为什么 sizeof(int) 在不同的操作系统中会有所不同?

我想知道为什么 int 的大小取决于 C 和 C++ 中使用的操作系统。如果指针的大小不同是可以的,但是为什么整数的大小不同呢?如果 16 位操作系统 sizeof(int) = 2 字节,则对于 32 位操作系统 sizeof(int) = 4 字节。为什么这样?

谢谢。

c c++ operating-system

6
推荐指数
2
解决办法
5621
查看次数

我如何安全地确保根据OpenGL规范正确实现char*类型(在任何平台上)?

在尝试使用c ++和OpenGL3 +进行图形编程时,我遇到了一个稍微专门的理解问题,包括char类型,指向它的指针以及潜在的隐式或显式转换到其他char指针类型.我想我已经找到了一个解决方案,但我想通过要求你对此进行双重检查.

当前(2014年10月)OpenGL4.5核心配置文件规范(2.2章命令语法中的表2.2)列出了OpenGL数据类型并明确说明了

GL类型不是C类型.因此,例如,GL类型int在本文档之外被称为GLint,并且不一定等同于C类型int.实现必须精确使用表中指示的位数来表示GL类型.

此表中的GLchar类型被指定为位宽8的类型,用于表示组成字符串的字符.
为了进一步缩小GLchar提供的范围,我们可以看一下GLSL规范(OpenGL着色语言4.25,2014年7月,第3.1章字符集和编译阶段):

用于OpenGL着色语言的源字符集是UTF-8编码方案中的Unicode.

现在,我在任何OpenGL库头中实现它的方式,我关心的是一个简单的

typedef char GLchar;
Run Code Online (Sandbox Code Playgroud)

当然,我刚才引用了"GL类型不是C类型"的说法.

通常,这不会是一个问题,因为typedef仅适用于底层类型可能在将来发生变化的情况.

问题始于用户实现.

通过几个关于OpenGL的教程,我遇到了各种方法将GLSL源代码分配给处理它所需的GLchar数组.(请原谅我没有提供所有链接.目前,我没有这样做的声誉.)

网站open.gl喜欢这样做:

const GLchar* vertexSource =
"#version 150 core\n"
"in vec2 position;"
"void main() {"
"   gl_Position = vec4(position, 0.0, 1.0);"
"}";
Run Code Online (Sandbox Code Playgroud)

或这个:

// Shader macro
#define GLSL(src) "#version 150 core\n" #src

// Vertex shader
const GLchar* vertexShaderSrc = GLSL(
  in vec2 pos;

  void main() {
      gl_Position = vec4(pos, 0.0, 1.0);
  }
);
Run Code Online (Sandbox Code Playgroud)

在lazyfoo.net(第30章加载文本文件着色器)中,源代码从文件(我的首选方法)读取到一个std::string shaderString变量中,然后用于初始化GL字符串:

const GLchar* …
Run Code Online (Sandbox Code Playgroud)

c++ opengl type-conversion type-safety char-pointer

6
推荐指数
2
解决办法
859
查看次数

比较双重时的不同行为

您好我知道计算机受数字精度的限制,有些数字无法在二进制系统中准确表示.这就是我问为什么这样比较的原因

(0.1*3) == 0.3
Run Code Online (Sandbox Code Playgroud)

在Java语言中评估为false在C中它评估为true,对我来说Java行为更直观一些.任何提供的答案都不能回答我的问题,为什么他们有不同的行为,因为两者都使用IEEE 754标准.

@update我正在使用ideone来测试条件.

c java

6
推荐指数
1
解决办法
114
查看次数

编译器和负数表示

最近我对这个问题很困惑.也许是因为我没有阅读语言规范(这是我的错,我知道).

C99标准没有说明编译器应该使用哪个负数表示.我一直认为存储负数的唯一正确方法是两个补码(在大多数情况下).

所以这是我的问题:您是否知道任何现在的编译器默认实现一个补码或符号幅度表示?我们可以用一些编译器标志更改默认表示吗?

确定使用哪种表示的最简单方法是什么?

那么C++标准呢?

c c++ compiler-construction representation negative-number

5
推荐指数
1
解决办法
1765
查看次数

对于Apple实现(Cocoa/CocoaTouch),uint8_t总是与unsigned char相同的类型?

在浏览iPhone的示例代码应用程序时,我发现了一对有效具有相同签名定义的发送/接收方法,但与其中一个变量关联的值类型除外.

从标题内:

- (void)receivedData: (unsigned char *)data length:(NSUInteger)len;
- (void)sendData:     (uint8_t*)       data length:(NSUInteger) len;
Run Code Online (Sandbox Code Playgroud)

这些方法用作发送/接收进程的包装器,它有效地传递指向byte正在写入数据流和从数据流写入的数据数组的指针.我发现这些方法签名有点好奇,因为我是Cocoa/Cocoa Touch dev的新手,所以我决定查看该uint8_t类型的定义.我发现它uint8_t被定义为unsigned char内部stdint.h,因此,data这些方法的变量完全相同.至少,stdint.h在XCode 4.2中链接的情况就是如此.

然而,对uint8_t类型进行了一些进一步的研究,我发现了关于与使用的问题.共识似乎是这两种值类型完全相同但是对于C标准库的一些实现,它们可能是不同的.因此,人们不应相信在生成可移植代码时它们将是相同类型的数据.uint8_tunsigned char

话虽如此,从Apple/Objective-C编程环境中假设是否可以安全地uint8_t使用,unsigned char或者我应该遵循上述问题中给出的相同建议吗?

这可能看起来像一个挑剔的问题,但是因为我可能正在集成库,这种类型的编码错误行为似乎在个人代码库中有点普遍,可以在多个Apple环境中使用(相当长一段时间)来了),我想进一步评论.

c xcode cocoa cocoa-touch objective-c

5
推荐指数
1
解决办法
1444
查看次数

我应该在计算它们的位运算之前将我的整数截断为短路吗?

假设我有一个按位表达式f: int -> int,它只依赖于输入的两个最低字节.在一般情况下,这将是任何更快的计算(uint32)f'((uint16)x),在那里f': short -> short?或者转换涉及开销?假设f编译器过于复杂,无法自行解决这个问题.

c optimization performance x86 bit-manipulation

5
推荐指数
2
解决办法
159
查看次数

写入文件时,以下数据是否跨平台兼容?

我有一个具有以下格式的结构:

struct Serializable {
    uint64_t value1;
    uint32_t value2;
    uint16_t value3;
    uint8_t  value4;

    // returns the raw data after converting the values to big-endian format 
    // if the current architecture follows little-endian format. Else, if 
    // if the current architecture follows big-endian format, the return 
    // expression will be "return (char*) (this);" 
    char* convert_all_to_bigendian();

    // checks if the architecture follows little-endian format or big-endian format. 
    // If the little-endian format is followed, after the contents of rawdata 
    // are copied back …
Run Code Online (Sandbox Code Playgroud)

c++ serialization fstream cross-platform

5
推荐指数
0
解决办法
164
查看次数

将 unsigned char 数组转换为 uint8_t 数组?

我需要将 unsigned char 数组转换为 unit8_t 数组也许有人知道如何做到这一点?

我试图在互联网上寻找信息,但不幸的是我没有成功。

:)

c unsigned-char

4
推荐指数
1
解决办法
6176
查看次数