在 c 中的 unsigned short int 中分配零
Posted
技术标签:
【中文标题】在 c 中的 unsigned short int 中分配零【英文标题】:assign zero in unsigned short int in c 【发布时间】:2016-01-27 13:49:27 【问题描述】:我尝试将零分配给名为列表的结构中的字段
list.ultimo = 0;
但是当我使用 printf 时
printf("%d", list.ultimo);
我得到结果
32766
但是当我添加时
unsigned short int cero = 0;
printf的结果是正确的,不管用cero。为什么?
lista.h
#ifndef LISTA_H
#define LISTA_H
typedef struct
elemento lista[TAMANOMAX];
unsigned short int ultimo;
LISTA;
void Insertar(elemento, unsigned short int posicion, LISTA);
#endif
lista.c
#include<stdio.h>
typedef short int elemento;
#ifndef TAMANOMAX
#define TAMANOMAX 10
#endif
#include"lista.h"
void Insertar(elemento x, unsigned short int p, LISTA lista)
if (lista.ultimo >= TAMANOMAX)
puts("full list");
printf("%hu",lista.ultimo);
main.c
#include<stdio.h>
typedef unsigned short int elemento;
#define TAMANOMAX 4
#include"lista.h"
int main()
LISTA esferas;
esferas.ultimo = 0;
Insertar(2,0,esferas);
printf("\n%hu\n", esferas.ultimo);
return 0;
结果是
$gcc -Wall lista.c main.c
full list
32765
0
我是新手,我现在很慢,很抱歉耽搁了
【问题讨论】:
你不觉得这些信息还不够吗?显示结构的定义以及list
的定义。
请不要告诉我ultimo
是未签名的,而您正在使用%d
打印...
@SouravGhosh 哈哈!你猜错了 - 这是一个无符号短片
@MartinJames 是的,我的错……我错过了标题……;)
您应该向我们展示更多代码来帮助您
【参考方案1】:
使用%hd
打印short int
,使用%hu
打印unsigned short int
。 %d
代表int
。
编辑:现在您已经发布了完整的代码,看来TAMANOMAX
在lista.c
中设置为10
,但在main.c
中设置为4
,导致您的@987654333 之间不兼容@函数和Insertar
一个。您应该在所有文件中具有相同的值。如果您想使用不同的数组长度,请在您的 LISTA
结构中添加一个 length
成员。但是TAMANOMAX
在任何地方都应该完全一样,否则实际上您正在使用不同的数据类型,您的程序将无法运行。
【讨论】:
虽然这是个好建议,但我认为它不能回答问题。%d
在 sizeof(unsigned short) < sizeof(int)
时对 unsigned short
工作得很好,在另一种情况下,vale 0
不应该变成 32766
- 未定义的行为与否。正在发生其他事情(很可能问题中缺少信息)。
感谢回复,我认为不是格式说明符与“% hu”的问题我有同样的错误结果。
确实,正如@SanderDeDycker 已经注意到的那样。但是在这种情况下,请发布一个 Minimal, Complete, and Verifiable example,因为您得到的结果不仅仅是好奇:***.com/help/mcve
我觉得是预处理器的问题,TAMANOMAX常量
非常感谢,我尝试从 main.c 控制数组的大小,模拟函数重载,默认使用选项 TAMANOMAX 10。以后会更细心的问和代码【参考方案2】:
对参数类型使用不匹配的格式说明符会调用undefined behavior。
引用C11
标准,第 7.21.6.1 章,fprintf()
函数
[..] 如果有任何参数 不是相应转换规范的正确类型,行为是 未定义。
关于%d
格式说明符,
d,i
int
参数 [....]
所以,%d
需要 int
。
根据您的问题标题,ultimo
是 unsigned short int
并且您正在使用 %d
打印值。
您应该使用%hu
打印unsigned short int
。
【讨论】:
以上是关于在 c 中的 unsigned short int 中分配零的主要内容,如果未能解决你的问题,请参考以下文章
C语言中的unsigned char数组怎么转成unsigned short数组
unsigned short int 与 unsigned int 有何不同